| Index: chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapterTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapterTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..91754d8b8d83b4720e8d762066b7471646168159
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapterTest.java
|
| @@ -0,0 +1,315 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.download.ui;
|
| +
|
| +import static org.chromium.chrome.browser.widget.DateDividedAdapter.TYPE_DATE;
|
| +import static org.chromium.chrome.browser.widget.DateDividedAdapter.TYPE_NORMAL;
|
| +
|
| +import android.support.v7.widget.RecyclerView;
|
| +import android.test.InstrumentationTestCase;
|
| +import android.test.UiThreadTest;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +
|
| +import org.chromium.chrome.browser.download.DownloadInfo;
|
| +import org.chromium.chrome.browser.download.DownloadItem;
|
| +import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
|
| +import org.chromium.content.browser.test.util.CallbackHelper;
|
| +
|
| +import java.text.SimpleDateFormat;
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +import java.util.Locale;
|
| +
|
| +/**
|
| + * Tests a DownloadHistoryAdapter that is isolated from the real bridges.
|
| + */
|
| +public class DownloadHistoryAdapterTest extends InstrumentationTestCase {
|
| +
|
| + private static class StubbedAdapter extends DownloadHistoryAdapter {
|
| + private final SelectionDelegate<DownloadItem> mDelegate = new SelectionDelegate<>();
|
| +
|
| + StubbedAdapter(boolean showOffTheRecord) {
|
| + super(showOffTheRecord, null);
|
| + }
|
| +
|
| + @Override
|
| + protected SelectionDelegate getSelectionDelegate(DownloadManagerUi manager) {
|
| + return mDelegate;
|
| + }
|
| +
|
| + @Override
|
| + protected void initializeDownloadBridge() {
|
| + }
|
| +
|
| + @Override
|
| + protected void initializeOfflinePageBridge() {
|
| + }
|
| + }
|
| +
|
| + private static class Observer extends RecyclerView.AdapterDataObserver {
|
| + public CallbackHelper onChangedCallback = new CallbackHelper();
|
| +
|
| + @Override
|
| + public void onChanged() {
|
| + onChangedCallback.notifyCalled();
|
| + }
|
| + }
|
| +
|
| + private DownloadHistoryAdapter mAdapter;
|
| + private Observer mObserver;
|
| +
|
| + private void initializeAdapter(boolean showOffTheRecord) {
|
| + mObserver = new Observer();
|
| + mAdapter = new StubbedAdapter(showOffTheRecord);
|
| + mAdapter.initialize(null);
|
| + mAdapter.registerAdapterDataObserver(mObserver);
|
| + }
|
| +
|
| + /** Nothing downloaded, nothing shown. */
|
| + @SmallTest
|
| + public void testInitialize_Empty() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| +
|
| + assertEquals(0, mAdapter.getItemCount());
|
| + assertEquals(0, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** One downloaded item should show the item and a date header. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testInitialize_SingleItem() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + DownloadItem firstItem = createDownloadItem(0, "19840116 12:00");
|
| + regularItems.add(firstItem);
|
| +
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(1, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** Two items downloaded on the same day should end up in the same date group. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testInitialize_TwoItemsOneDate() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + regularItems.add(createDownloadItem(0, "19840116 12:00"));
|
| + regularItems.add(createDownloadItem(1, "19840116 12:01"));
|
| +
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_NORMAL);
|
| + assertEquals(11, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** Two items downloaded on different days should end up in different date groups. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testInitialize_TwoItemsTwoDates() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + regularItems.add(createDownloadItem(0, "19840116 12:00"));
|
| + regularItems.add(createDownloadItem(1, "19840117 12:00"));
|
| +
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(11, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** Off the record downloads are ignored if the DownloadHistoryAdapter isn't watching them. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testInitialize_OffTheRecord_Ignored() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + regularItems.add(createDownloadItem(0, "19840116 12:00"));
|
| +
|
| + List<DownloadItem> offTheRecordItems = new ArrayList<DownloadItem>();
|
| + offTheRecordItems.add(createDownloadItem(1, "19840116 12:00"));
|
| +
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(offTheRecordItems, true);
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| +
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(1, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** A regular and a off the record item with the same date are bucketed together. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testInitialize_OffTheRecord_TwoItemsOneDate() throws Exception {
|
| + initializeAdapter(true);
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + regularItems.add(createDownloadItem(0, "19840116 12:00"));
|
| +
|
| + List<DownloadItem> offTheRecordItems = new ArrayList<DownloadItem>();
|
| + offTheRecordItems.add(createDownloadItem(1, "19840116 12:00"));
|
| +
|
| + int callCount = mObserver.onChangedCallback.getCallCount();
|
| + assertEquals(0, callCount);
|
| + mAdapter.onAllDownloadsRetrieved(offTheRecordItems, true);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 1);
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(callCount, 2);
|
| +
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_NORMAL);
|
| + assertEquals(11, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** Adding new items should bucket them into the proper dates. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testUpdate_UpdateItems() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + // Start with an empty Adapter.
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + assertEquals(0, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(0, 1);
|
| + assertEquals(0, mAdapter.getItemCount());
|
| + assertEquals(0, mAdapter.getTotalDownloadSize());
|
| +
|
| + // Add the first item.
|
| + mAdapter.onDownloadItemUpdated(createDownloadItem(0, "19840116 12:00"), false);
|
| + mObserver.onChangedCallback.waitForCallback(1, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(1, mAdapter.getTotalDownloadSize());
|
| +
|
| + // Add a second item with a different date.
|
| + DownloadItem secondItem = createDownloadItem(1, "19840117 12:00");
|
| + assertEquals(2, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onDownloadItemUpdated(secondItem, false);
|
| + mObserver.onChangedCallback.waitForCallback(2, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(11, mAdapter.getTotalDownloadSize());
|
| +
|
| + // Add a third item with the same date as the second item.
|
| + assertEquals(3, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onDownloadItemUpdated(createDownloadItem(2, "19840117 12:00"), false);
|
| + mObserver.onChangedCallback.waitForCallback(3, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(111, mAdapter.getTotalDownloadSize());
|
| +
|
| + // An item with the same values as the second item should just update the old one.
|
| + assertEquals(4, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onDownloadItemUpdated(createDownloadItem(2, "19840117 12:00"), false);
|
| + mObserver.onChangedCallback.waitForCallback(4, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL);
|
| + assertEquals(111, mAdapter.getTotalDownloadSize());
|
| + }
|
| +
|
| + /** Test removal of items. */
|
| + @UiThreadTest
|
| + @SmallTest
|
| + public void testRemove_ThreeItemsTwoDates() throws Exception {
|
| + initializeAdapter(false);
|
| +
|
| + // Initialize the DownloadHistoryAdapter with three items in two date buckets.
|
| + DownloadItem item0 = createDownloadItem(0, "19840116 12:00");
|
| + DownloadItem item1 = createDownloadItem(1, "19840116 12:01");
|
| + DownloadItem item2 = createDownloadItem(2, "19840117 12:01");
|
| +
|
| + List<DownloadItem> regularItems = new ArrayList<DownloadItem>();
|
| + regularItems.add(item0);
|
| + regularItems.add(item1);
|
| + regularItems.add(item2);
|
| +
|
| + assertEquals(0, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onAllDownloadsRetrieved(regularItems, false);
|
| + mObserver.onChangedCallback.waitForCallback(0, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL, TYPE_NORMAL);
|
| + assertEquals(111, mAdapter.getTotalDownloadSize());
|
| +
|
| + // Remove an item from the date bucket with two items.
|
| + assertEquals(1, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onDownloadItemRemoved(item1.getId(), false);
|
| + mObserver.onChangedCallback.waitForCallback(1, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL, TYPE_DATE, TYPE_NORMAL);
|
| +
|
| + // Remove an item from the second bucket, which removes it entirely.
|
| + assertEquals(2, mObserver.onChangedCallback.getCallCount());
|
| + mAdapter.onDownloadItemRemoved(item2.getId(), false);
|
| + mObserver.onChangedCallback.waitForCallback(2, 1);
|
| + checkAdapterTypes(TYPE_DATE, TYPE_NORMAL);
|
| + }
|
| +
|
| + /** Checks that the adapter has the correct types of items in the right places. */
|
| + private void checkAdapterTypes(Integer... expectedTypes) {
|
| + assertEquals(expectedTypes.length, mAdapter.getItemCount());
|
| + for (int i = 0; i < expectedTypes.length; i++) {
|
| + assertEquals(expectedTypes[i].intValue(), mAdapter.getItemViewType(i));
|
| + }
|
| + }
|
| +
|
| + /** Converts a date string to a timestamp. */
|
| + private long dateToEpoch(String dateStr) throws Exception {
|
| + return new SimpleDateFormat("yyyyMMdd HH:mm", Locale.getDefault()).parse(dateStr).getTime();
|
| + }
|
| +
|
| + /** Creates a new DownloadItem with pre-defined values. */
|
| + private DownloadItem createDownloadItem(int which, String date)
|
| + throws Exception {
|
| + DownloadItem item = null;
|
| + if (which == 0) {
|
| + item = new DownloadItem(false, new DownloadInfo.Builder()
|
| + .setUrl("https://google.com")
|
| + .setContentLength(1)
|
| + .setFileName("first_file")
|
| + .setFilePath("/storage/fake_path/Downloads/first_file")
|
| + .setDownloadGuid("first_guid")
|
| + .setMimeType("image/gif")
|
| + .build());
|
| + } else if (which == 1) {
|
| + item = new DownloadItem(false, new DownloadInfo.Builder()
|
| + .setUrl("https://ugh.com")
|
| + .setContentLength(10)
|
| + .setFileName("second_file")
|
| + .setFilePath("/storage/fake_path/Downloads/second_file")
|
| + .setDownloadGuid("second_guid")
|
| + .setMimeType("image/gif")
|
| + .build());
|
| + } else if (which == 2) {
|
| + item = new DownloadItem(false, new DownloadInfo.Builder()
|
| + .setUrl("https://ugh.com")
|
| + .setContentLength(100)
|
| + .setFileName("third_file")
|
| + .setFilePath("/storage/fake_path/Downloads/third_file")
|
| + .setDownloadGuid("third_guid")
|
| + .setMimeType("text/plain")
|
| + .build());
|
| + } else {
|
| + return null;
|
| + }
|
| +
|
| + item.setStartTime(dateToEpoch(date));
|
| + return item;
|
| + }
|
| +
|
| +}
|
|
|