blob: e10829fc2e60f4ad5fcaccf472e20d0c7315f7bf [file] [log] [blame]
// 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.android_webview.test.services;
import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.SINGLE_PROCESS;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import androidx.test.filters.MediumTest;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.android_webview.common.services.IVariationsSeedServer;
import org.chromium.android_webview.common.services.IVariationsSeedServerCallback;
import org.chromium.android_webview.common.variations.VariationsServiceMetricsHelper;
import org.chromium.android_webview.common.variations.VariationsUtils;
import org.chromium.android_webview.services.VariationsSeedServer;
import org.chromium.android_webview.test.AwJUnit4ClassRunner;
import org.chromium.android_webview.test.OnlyRunIn;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.util.CallbackHelper;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* Test VariationsSeedServer. These tests are not batched to make sure all unbinded services are
* properly killed between tests.
*/
@RunWith(AwJUnit4ClassRunner.class)
@OnlyRunIn(SINGLE_PROCESS)
public class VariationsSeedServerTest {
private File mTempFile;
private class StubSeedServerCallback extends IVariationsSeedServerCallback.Stub {
public CallbackHelper helper = new CallbackHelper();
public Bundle metrics;
@Override
public void reportVariationsServiceMetrics(Bundle metrics) {
this.metrics = metrics;
helper.notifyCalled();
}
}
@Before
public void setUp() throws IOException {
mTempFile = File.createTempFile("test_variations_seed", null);
}
@After
public void tearDown() {
Assert.assertTrue("Failed to delete \"" + mTempFile + "\"", mTempFile.delete());
}
@Test
@MediumTest
public void testGetSeed() throws FileNotFoundException, RemoteException {
final ParcelFileDescriptor file =
ParcelFileDescriptor.open(mTempFile, ParcelFileDescriptor.MODE_WRITE_ONLY);
Intent intent = new Intent(
ContextUtils.getApplicationContext(), VariationsSeedServer.class);
try (ServiceConnectionHelper helper =
new ServiceConnectionHelper(intent, Context.BIND_AUTO_CREATE)) {
IVariationsSeedServer service =
IVariationsSeedServer.Stub.asInterface(helper.getBinder());
// TODO(paulmiller): Test with various oldSeedDate values, after
// VariationsSeedServer can write actual seeds (with actual date values).
service.getSeed(file, /*oldSeedDate=*/0, new StubSeedServerCallback());
}
}
@Test
@MediumTest
public void testReportMetrics()
throws FileNotFoundException, TimeoutException, RemoteException {
// Update the stamp time to avoid requesting a new seed.
VariationsUtils.updateStampTime();
// Write some fake metrics that should be reported during the getSeed IPC.
Context context = ContextUtils.getApplicationContext();
VariationsServiceMetricsHelper initialMetrics =
VariationsServiceMetricsHelper.fromBundle(new Bundle());
initialMetrics.setJobInterval(6000);
initialMetrics.setJobQueueTime(1000);
initialMetrics.setLastEnqueueTime(4);
initialMetrics.setLastJobStartTime(7);
Assert.assertTrue("Failed to write initial variations SharedPreferences",
initialMetrics.writeMetricsToVariationsSharedPreferences(context));
VariationsSeedServer server = new VariationsSeedServer();
IBinder binder = server.onBind(null);
StubSeedServerCallback callback = new StubSeedServerCallback();
IVariationsSeedServer.Stub.asInterface(binder).getSeed(
ParcelFileDescriptor.open(mTempFile, ParcelFileDescriptor.MODE_WRITE_ONLY),
/*oldSeedDate=*/0, callback);
callback.helper.waitForCallback(
"Timed out waiting for reportSeedMetrics() to be called", 0);
VariationsServiceMetricsHelper metrics =
VariationsServiceMetricsHelper.fromBundle(callback.metrics);
Assert.assertEquals(6000, metrics.getJobInterval());
Assert.assertEquals(1000, metrics.getJobQueueTime());
}
}