Commit d281b332 authored by Robert Kaplow's avatar Robert Kaplow Committed by Commit Bot

Add Android UKM test for browser history deletion

Bug: 804439
Change-Id: If0c4941a8e9f0deb9205fbb06d33aa82e791a05d
Reviewed-on: https://chromium-review.googlesource.com/1000553
Commit-Queue: Robert Kaplow <rkaplow@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarSteven Holte <holte@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549727}
parent ccfe0341
// 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.metrics;
/**
* Utilities for Android UKM tests. Not to be used outside of testing.
*/
public class UkmUtilsForTest {
/**
* True if the UKM Service is enabled.
*/
public static boolean isEnabled() {
return nativeIsEnabled();
}
/**
* True if the input |sourceId| exists within the current UKM recording.
*/
public static boolean hasSourceWithId(long sourceId) {
return nativeHasSourceWithId(sourceId);
}
/**
* Record a single Source with the given |sourceId| with a dummy URL.
*/
public static void recordSourceWithId(long sourceId) {
nativeRecordSourceWithId(sourceId);
}
private static native boolean nativeIsEnabled();
private static native boolean nativeHasSourceWithId(long sourceId);
private static native void nativeRecordSourceWithId(long sourceId);
}
......@@ -662,6 +662,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java",
"java/src/org/chromium/chrome/browser/metrics/StartupMetrics.java",
"java/src/org/chromium/chrome/browser/metrics/StartupPageLoadMetricsObserver.java",
"java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java",
"java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java",
"java/src/org/chromium/chrome/browser/metrics/UmaUtils.java",
"java/src/org/chromium/chrome/browser/metrics/VariationsSession.java",
......@@ -1670,7 +1671,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java",
"javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java",
"javatests/src/org/chromium/chrome/browser/metrics/UkmIncognitoTest.java",
"javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java",
"javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogManagerTest.java",
"javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowTestHelper.java",
......
......@@ -14,9 +14,14 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
import org.chromium.chrome.browser.browsing_data.TimePeriod;
import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
......@@ -25,12 +30,12 @@ import org.chromium.content.browser.test.util.JavaScriptUtils;
import org.chromium.ui.base.PageTransition;
/**
* Tests for UKM monitoring of incognito activity.
* Android UKM tests.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.
Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-enable-metrics-reporting"})
public class UkmIncognitoTest {
public class UkmTest {
@Rule
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
......@@ -41,6 +46,8 @@ public class UkmIncognitoTest {
mActivityTestRule.startMainActivityOnBlankPage();
}
// TODO(rkaplow): Swap these methods (here and in UkmTest.java) with the JNI methods in
// UkmUtilsForTest.
/*
* These helper method should stay in sync with the tests within
* sync_shell/.../chrome/browser/sync/UkmTest.java.
......@@ -146,4 +153,49 @@ public class UkmIncognitoTest {
closeIncognitoTab();
Assert.assertTrue("UKM Enabled:", isUkmEnabled(normalTab));
}
@Test
@SmallTest
public void testHistoryDeleteCheck() throws Exception {
// Keep in sync with UkmBrowserTest.HistoryDeleteCheck in
// chrome/browser/metrics/ukm_browsertest.cc.
Tab normalTab = mActivityTestRule.getActivity().getActivityTab();
ThreadUtils.runOnUiThreadBlocking(
() -> { Assert.assertTrue(UkmUtilsForTest.isEnabled()); });
String originalClientId = getUkmClientId(normalTab);
// Record some dummy UKM data (adding a Source).
final long sourceId = 0x54321;
ThreadUtils.runOnUiThreadBlocking(() -> {
// Write data under a dummy sourceId and verify it is there.
UkmUtilsForTest.recordSourceWithId(sourceId);
Assert.assertTrue(UkmUtilsForTest.hasSourceWithId(sourceId));
});
CallbackHelper callbackHelper = new CallbackHelper();
// Clear all browsing history.
ThreadUtils.runOnUiThreadBlocking(() -> {
BrowsingDataBridge.getInstance().clearBrowsingData(new OnClearBrowsingDataListener() {
@Override
public void onBrowsingDataCleared() {
callbackHelper.notifyCalled();
}
}, new int[] {BrowsingDataType.HISTORY}, TimePeriod.ALL_TIME);
});
callbackHelper.waitForCallback(0);
ThreadUtils.runOnUiThreadBlocking(() -> {
// Verify that UKM is still running.
Assert.assertTrue(UkmUtilsForTest.isEnabled());
// The source under sourceId should be removed.
Assert.assertFalse(UkmUtilsForTest.hasSourceWithId(sourceId));
});
// Client ID should NOT have been reset.
Assert.assertEquals("Client id:", originalClientId, getUkmClientId(normalTab));
}
}
......@@ -53,9 +53,10 @@ public class UkmTest {
() -> UmaSessionStats.unSetMetricsAndCrashReportingForTesting());
}
// TODO(rkaplow): Swap these methods with the JNI methods in UkmUtilsForTest.
/*
* These helper method should stay in sync with
* chrome/browser/metrics/UkmIncognitoTest.java.
* chrome/browser/metrics/UkmTest.java.
*/
public String getElementContent(Tab normalTab, String elementId) throws Exception {
mSyncTestRule.loadUrlInTab(
......
......@@ -2061,6 +2061,7 @@ jumbo_split_static_library("browser") {
"android/logo_bridge.cc",
"android/logo_bridge.h",
"android/metrics/launch_metrics.cc",
"android/metrics/ukm_utils_for_test.cc",
"android/metrics/uma_session_stats.cc",
"android/metrics/uma_session_stats.h",
"android/metrics/uma_utils.cc",
......@@ -4332,6 +4333,7 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java",
"../android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java",
"../android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java",
"../android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java",
"../android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java",
"../android/java/src/org/chromium/chrome/browser/metrics/UmaUtils.java",
"../android/java/src/org/chromium/chrome/browser/metrics/VariationsSession.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.
#include "base/android/jni_string.h"
#include "chrome/browser/browser_process.h"
#include "components/metrics_services_manager/metrics_services_manager.h"
#include "components/ukm/ukm_service.h"
#include "jni/UkmUtilsForTest_jni.h"
#include "chrome/browser/android/metrics/ukm_utils_for_test.h"
using base::android::JavaParamRef;
namespace ukm {
// static
bool UkmUtilsForTest::IsEnabled() {
auto* service =
g_browser_process->GetMetricsServicesManager()->GetUkmService();
return service ? service->recording_enabled_ : false;
}
// static
bool UkmUtilsForTest::HasSourceWithId(SourceId source_id) {
auto* service =
g_browser_process->GetMetricsServicesManager()->GetUkmService();
DCHECK(service);
return !!service->sources().count(source_id);
}
// static
void UkmUtilsForTest::RecordSourceWithId(SourceId source_id) {
auto* service =
g_browser_process->GetMetricsServicesManager()->GetUkmService();
DCHECK(service);
service->UpdateSourceURL(source_id, GURL("http://example.com"));
}
} // namespace ukm
static jboolean JNI_UkmUtilsForTest_IsEnabled(JNIEnv*,
const JavaParamRef<jclass>&) {
return ukm::UkmUtilsForTest::IsEnabled();
}
static jboolean JNI_UkmUtilsForTest_HasSourceWithId(JNIEnv*,
const JavaParamRef<jclass>&,
jlong source_id) {
ukm::SourceId source = static_cast<ukm::SourceId>(source_id);
return ukm::UkmUtilsForTest::HasSourceWithId(source);
}
static void JNI_UkmUtilsForTest_RecordSourceWithId(JNIEnv*,
const JavaParamRef<jclass>&,
jlong source_id) {
ukm::SourceId source = static_cast<ukm::SourceId>(source_id);
ukm::UkmUtilsForTest::RecordSourceWithId(source);
}
// 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.
#ifndef CHROME_BROWSER_ANDROID_METRICS_UKM_UTILS_FOR_TEST_H_
#define CHROME_BROWSER_ANDROID_METRICS_UKM_UTILS_FOR_TEST_H_
#include <stdint.h>
#include "base/macros.h"
namespace ukm {
// The native part of java UkmUtilsForTest class.
class UkmUtilsForTest {
public:
static bool IsEnabled();
static bool HasSourceWithId(SourceId source_id);
static void RecordSourceWithId(SourceId source_id);
private:
// Should never be needed, as this class is setup to let it be a friend to
// access UKM internals for testing.
UkmUtilsForTest();
~UkmUtilsForTest();
DISALLOW_COPY_AND_ASSIGN(UkmUtilsForTest);
};
} // namespace ukm
#endif // CHROME_BROWSER_ANDROID_METRICS_UKM_UTILS_FOR_TEST_H_
......@@ -281,9 +281,9 @@ class UkmEnabledChecker : public SingleClientStatusChangeChecker {
};
// Make sure that UKM is disabled while an incognito window is open.
// Keep in sync with UkmIncognitoTest.testRegularPlusIncognitoCheck in
// Keep in sync with UkmTest.testRegularPlusIncognitoCheck in
// chrome/android/javatests/src/org/chromium/chrome/browser/metrics/
// UkmIncognitoTest.java.
// UkmTest.java.
IN_PROC_BROWSER_TEST_F(UkmBrowserTest, RegularPlusIncognitoCheck) {
MetricsConsentOverride metrics_consent(true);
......@@ -320,9 +320,9 @@ IN_PROC_BROWSER_TEST_F(UkmBrowserTest, RegularPlusIncognitoCheck) {
}
// Make sure opening a real window after Incognito doesn't enable UKM.
// Keep in sync with UkmIncognitoTest.testIncognitoPlusRegularCheck in
// Keep in sync with UkmTest.testIncognitoPlusRegularCheck in
// chrome/android/javatests/src/org/chromium/chrome/browser/metrics/
// UkmIncognitoTest.java.
// UkmTest.java.
IN_PROC_BROWSER_TEST_F(UkmBrowserTest, IncognitoPlusRegularCheck) {
MetricsConsentOverride metrics_consent(true);
......@@ -741,6 +741,9 @@ IN_PROC_BROWSER_TEST_F(UkmBrowserTest, MetricsReportingCheck) {
}
// Make sure that pending data is deleted when user deletes history.
// Keep in sync with UkmTest.testHistoryDeleteCheck in
// chrome/android/javatests/src/org/chromium/chrome/browser/metrics/
// UkmTest.java.
IN_PROC_BROWSER_TEST_F(UkmBrowserTest, HistoryDeleteCheck) {
MetricsConsentOverride metrics_consent(true);
......
......@@ -6,7 +6,10 @@
#define COMPONENTS_UKM_UKM_RECORDER_IMPL_H_
#include <map>
#include <memory>
#include <set>
#include <string>
#include <unordered_set>
#include <vector>
#include "base/callback_forward.h"
......@@ -22,9 +25,9 @@ class UkmEGTestHelper;
}
namespace ukm {
class UkmSource;
class Report;
class UkmSource;
class UkmUtilsForTest;
namespace debug {
class UkmDebugDataExtractor;
......@@ -75,6 +78,7 @@ class UkmRecorderImpl : public UkmRecorder {
friend ::metrics::UkmBrowserTest;
friend ::metrics::UkmEGTestHelper;
friend ::ukm::debug::UkmDebugDataExtractor;
friend ::ukm::UkmUtilsForTest;
struct MetricAggregate {
uint64_t total_count = 0;
......
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