Commit fe50a0a9 authored by Andrew Luo's avatar Andrew Luo Committed by Commit Bot

Add Storage conformance tests

Bug: 816708
Change-Id: I0477ba7d3c93bef726c9bf0bc9879882ebedbfd9
Reviewed-on: https://chromium-review.googlesource.com/c/1290144Reviewed-by: default avatarSky Malice <skym@chromium.org>
Reviewed-by: default avatarGang Wu <gangwu@chromium.org>
Commit-Queue: Andrew Luo <aluo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611266}
parent ad8e36b0
......@@ -47,8 +47,11 @@ if (enable_feed_in_chrome) {
]
feed_test_java_sources = [
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/ConsumerSyncWrapper.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedContentStorageConformanceTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedJournalStorageConformanceTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNetworkBridgeConformanceTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageTest.java",
"//chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedSchedulerBridgeConformanceTest.java",
......
// Copyright 2018 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.feed;
import com.google.android.libraries.feed.common.functional.Consumer;
import org.junit.Assert;
import org.chromium.base.ThreadUtils;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
/**
* ConsumerSyncWrapper allows the user to wait for the wrapped consumer to
* accept an input.
*/
class ConsumerSyncWrapper<T> implements Consumer<T> {
private final Consumer<T> mWrapped;
private final AtomicReference<T> mResult;
private final CountDownLatch mLatch;
private ConsumerSyncWrapper(Consumer<T> wrappedConsumer) {
mWrapped = wrappedConsumer;
mResult = new AtomicReference<>();
mLatch = new CountDownLatch(1);
}
private void blockAndWrappedAccept(long timeoutMs) {
try {
mLatch.await(timeoutMs, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Assert.fail("waitForAccept was interrupted: " + e.getMessage());
}
mWrapped.accept(mResult.get());
}
@Override
public void accept(T input) {
mResult.set(input);
mLatch.countDown();
}
/**
* waitForConsumer calls the consumer operation on the UI Thread then blocks until the
* consumer has accepted the results of the operation.
*
* @param consumer The {@link Consumer} to block on.
* @param operation The operation that should feed its result to the consumer.
* @param timeoutMs The timeout in milliseconds to wait for operation to execute
*/
static public <T> void waitForConsumer(
Consumer<T> consumer, Consumer<Consumer<T>> operation, long timeoutMs) {
ConsumerSyncWrapper<T> wrapper = new ConsumerSyncWrapper<>(consumer);
ThreadUtils.postOnUiThread(() -> operation.accept(wrapper));
wrapper.blockAndWrappedAccept(timeoutMs);
}
}
// Copyright 2018 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.feed;
import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
import android.support.test.filters.SmallTest;
import com.google.android.libraries.feed.common.Result;
import com.google.android.libraries.feed.common.functional.Consumer;
import com.google.android.libraries.feed.host.storage.CommitResult;
import com.google.android.libraries.feed.host.storage.ContentMutation;
import com.google.android.libraries.feed.testing.conformance.storage.ContentStorageConformanceTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import java.util.List;
import java.util.Map;
/**
* Conformance Tests for {@link FeedContentStorage}.
* The actual tests are implemented in ContentStorageConformanceTest.
*/
// The @SmallTest class annotation is needed to allow the inherited @Test methods to run using
// build/android/test_runner.py.
@SmallTest
@RunWith(ChromeJUnit4ClassRunner.class)
public final class FeedContentStorageConformanceTest extends ContentStorageConformanceTest {
private static final long TIMEOUT = scaleTimeout(1000);
class ContentStorageWrapper extends FeedContentStorage {
public ContentStorageWrapper(Profile p) {
super(p);
}
@Override
public void getAllKeys(Consumer < Result < List<String>>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.getAllKeys(wrapper); }, TIMEOUT);
}
@Override
public void get(List<String> keys, Consumer < Result < Map<String, byte[]>>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.get(keys, wrapper); }, TIMEOUT);
}
@Override
public void getAll(String prefix, Consumer < Result < Map<String, byte[]>>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.getAll(prefix, wrapper); }, TIMEOUT);
}
@Override
public void commit(ContentMutation mutation, Consumer<CommitResult> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.commit(mutation, wrapper); }, TIMEOUT);
}
}
@Rule
public final ChromeBrowserTestRule mRule = new ChromeBrowserTestRule();
@Before
public void setUp() throws Exception {
ThreadUtils.runOnUiThreadBlocking(() -> {
// storage is declared and tested in ContentStorageConformanceTest.
storage = new ContentStorageWrapper(Profile.getLastUsedProfile());
});
}
@After
public void tearDown() {
ThreadUtils.runOnUiThreadBlocking(() -> { ((ContentStorageWrapper) storage).destroy(); });
storage = null;
}
}
// Copyright 2018 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.feed;
import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
import android.support.test.filters.SmallTest;
import com.google.android.libraries.feed.common.Result;
import com.google.android.libraries.feed.common.functional.Consumer;
import com.google.android.libraries.feed.host.storage.CommitResult;
import com.google.android.libraries.feed.host.storage.JournalMutation;
import com.google.android.libraries.feed.testing.conformance.storage.JournalStorageConformanceTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import java.util.List;
/**
* Conformance Tests for {@link FeedJournalStorage}.
* The actual tests are implemented in JournalConformanceTest.
*/
// The @SmallTest class annotation is needed to allow the inherited @Test methods to run using
// build/android/test_runner.py.
@SmallTest
@RunWith(ChromeJUnit4ClassRunner.class)
public final class FeedJournalStorageConformanceTest extends JournalStorageConformanceTest {
private static final long TIMEOUT = scaleTimeout(3000);
/**
* JournalStorageWrapper executes FeedJournalStorage operations
* in the UiThread and blocks the test thread until the consumer
* has been called.
*/
class JournalStorageWrapper extends FeedJournalStorage {
public JournalStorageWrapper(Profile p) {
super(p);
}
@Override
public void read(String journalName, Consumer < Result < List<byte[]>>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.read(journalName, wrapper); }, TIMEOUT);
}
@Override
public void commit(JournalMutation mutation, Consumer<CommitResult> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.commit(mutation, wrapper); }, TIMEOUT);
}
@Override
public void exists(String journalName, Consumer<Result<Boolean>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.exists(journalName, wrapper); }, TIMEOUT);
}
@Override
public void getAllJournals(Consumer < Result < List<String>>> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.getAllJournals(wrapper); }, TIMEOUT);
}
@Override
public void deleteAll(Consumer<CommitResult> consumer) {
ConsumerSyncWrapper.waitForConsumer(
consumer, (wrapper) -> { super.deleteAll(wrapper); }, TIMEOUT);
}
}
@Rule
public final ChromeBrowserTestRule mRule = new ChromeBrowserTestRule();
@Before
public void setUp() throws Exception {
ThreadUtils.runOnUiThreadBlocking(() -> {
// journalStorage is declared and tested in JournalStorageConformanceTest.
journalStorage = new JournalStorageWrapper(Profile.getLastUsedProfile());
});
}
@After
public void tearDown() {
ThreadUtils.runOnUiThreadBlocking(
() -> { ((JournalStorageWrapper) journalStorage).destroy(); });
journalStorage = null;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment