Commit 069edaba authored by Sam McNally's avatar Sam McNally Committed by Commit Bot

Add a test for file manager enum metric reporting.

Bug: 969600
Change-Id: I3e181e886c2acdb5bc0ffd2cd6ab18d7282bb28f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1642610
Commit-Queue: Luciano Pacheco <lucmult@chromium.org>
Reviewed-by: default avatarLuciano Pacheco <lucmult@chromium.org>
Cr-Commit-Position: refs/heads/master@{#666116}
parent 17527304
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "ash/public/cpp/keyboard/keyboard_switches.h" #include "ash/public/cpp/keyboard/keyboard_switches.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h" #include "chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
...@@ -1027,6 +1028,16 @@ WRAPPED_INSTANTIATE_TEST_SUITE_P( ...@@ -1027,6 +1028,16 @@ WRAPPED_INSTANTIATE_TEST_SUITE_P(
TestCase("searchDownloadsWithNoResults"), TestCase("searchDownloadsWithNoResults"),
TestCase("searchDownloadsClearSearch"))); TestCase("searchDownloadsClearSearch")));
WRAPPED_INSTANTIATE_TEST_SUITE_P(
Metrics, /* metrics.js */
FilesAppBrowserTest,
::testing::Values(TestCase("metricsRecordEnum")));
WRAPPED_INSTANTIATE_TEST_SUITE_P(
Breadcrumbs, /* breadcrumbs.js */
FilesAppBrowserTest,
::testing::Values(TestCase("breadcrumbsNavigate")));
// Structure to describe an account info. // Structure to describe an account info.
struct TestAccountInfo { struct TestAccountInfo {
const char* const gaia_id; const char* const gaia_id;
......
...@@ -597,6 +597,40 @@ struct ExpectFileTasksMessage { ...@@ -597,6 +597,40 @@ struct ExpectFileTasksMessage {
file_tasks::FileTasksObserver::OpenType open_type; file_tasks::FileTasksObserver::OpenType open_type;
}; };
struct GetHistogramCountMessage {
static bool ConvertJSONValue(const base::DictionaryValue& value,
GetHistogramCountMessage* message) {
base::JSONValueConverter<GetHistogramCountMessage> converter;
return converter.Convert(value, message);
}
static void RegisterJSONConverter(
base::JSONValueConverter<GetHistogramCountMessage>* converter) {
converter->RegisterStringField("histogramName",
&GetHistogramCountMessage::histogram_name);
converter->RegisterIntField("value", &GetHistogramCountMessage::value);
}
std::string histogram_name;
int value = 0;
};
struct GetUserActionCountMessage {
static bool ConvertJSONValue(const base::DictionaryValue& value,
GetUserActionCountMessage* message) {
base::JSONValueConverter<GetUserActionCountMessage> converter;
return converter.Convert(value, message);
}
static void RegisterJSONConverter(
base::JSONValueConverter<GetUserActionCountMessage>* converter) {
converter->RegisterStringField(
"userActionName", &GetUserActionCountMessage::user_action_name);
}
std::string user_action_name;
};
} // anonymous namespace } // anonymous namespace
class FileManagerBrowserTestBase::MockFileTasksObserver class FileManagerBrowserTestBase::MockFileTasksObserver
...@@ -2247,6 +2281,26 @@ void FileManagerBrowserTestBase::OnCommand(const std::string& name, ...@@ -2247,6 +2281,26 @@ void FileManagerBrowserTestBase::OnCommand(const std::string& name,
return; return;
} }
if (name == "getHistogramCount") {
GetHistogramCountMessage message;
ASSERT_TRUE(GetHistogramCountMessage::ConvertJSONValue(value, &message));
base::JSONWriter::Write(base::Value(histograms_.GetBucketCount(
message.histogram_name, message.value)),
output);
return;
}
if (name == "getUserActionCount") {
GetUserActionCountMessage message;
ASSERT_TRUE(GetUserActionCountMessage::ConvertJSONValue(value, &message));
base::JSONWriter::Write(
base::Value(user_actions_.GetActionCount(message.user_action_name)),
output);
return;
}
FAIL() << "Unknown test message: " << name; FAIL() << "Unknown test message: " << name;
} }
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/test/metrics/histogram_tester.h"
#include "base/test/metrics/user_action_tester.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h"
...@@ -172,6 +174,9 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -172,6 +174,9 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
std::unique_ptr<MockFileTasksObserver> file_tasks_observer_; std::unique_ptr<MockFileTasksObserver> file_tasks_observer_;
base::HistogramTester histograms_;
base::UserActionTester user_actions_;
// Not owned. // Not owned.
SelectFileDialogExtensionTestFactory* select_factory_; SelectFileDialogExtensionTestFactory* select_factory_;
......
...@@ -99,8 +99,4 @@ IN_PROC_BROWSER_TEST_F(FileManagerUITest, ProgressCenter) { ...@@ -99,8 +99,4 @@ IN_PROC_BROWSER_TEST_F(FileManagerUITest, ProgressCenter) {
RunTest("progressCenter"); RunTest("progressCenter");
} }
IN_PROC_BROWSER_TEST_F(FileManagerUITest, UMA) {
RunTest("uma");
}
} // namespace file_manager } // namespace file_manager
...@@ -895,3 +895,15 @@ test.util.async.getVolumesCount = callback => { ...@@ -895,3 +895,15 @@ test.util.async.getVolumesCount = callback => {
test.util.sync.setPreferences = preferences => { test.util.sync.setPreferences = preferences => {
chrome.fileManagerPrivate.setPreferences(preferences); chrome.fileManagerPrivate.setPreferences(preferences);
}; };
/**
* Reports an enum metric.
* @param {string} name The metric name.
* @param {string} value The metric enumerator to record.
* @param {Array<string>} validValues An array containing the valid enumerators
* in order.
*
*/
test.util.sync.recordEnumMetric = (name, value, validValues) => {
metrics.recordEnum(name, value, validValues);
};
...@@ -27,7 +27,6 @@ action("create_test_main") { ...@@ -27,7 +27,6 @@ action("create_test_main") {
"js/strings.js", "js/strings.js",
"menu.js", "menu.js",
"progress_center.js", "progress_center.js",
"uma.js",
] ]
args = [ "--output=" + rebase_path(output, root_build_dir) ] args = [ "--output=" + rebase_path(output, root_build_dir) ]
outputs = [ outputs = [
...@@ -45,7 +44,6 @@ js_type_check("closure_compile") { ...@@ -45,7 +44,6 @@ js_type_check("closure_compile") {
":menu", ":menu",
":plugin_vm", ":plugin_vm",
":progress_center", ":progress_center",
":uma",
] ]
} }
...@@ -117,10 +115,3 @@ js_library("progress_center") { ...@@ -117,10 +115,3 @@ js_library("progress_center") {
"//ui/webui/resources/js:webui_resource_test", "//ui/webui/resources/js:webui_resource_test",
] ]
} }
js_library("uma") {
deps = [
"js:test_util",
"//ui/webui/resources/js:webui_resource_test",
]
}
// 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.
const uma = {};
uma.testClickBreadcrumb = async (done) => {
await test.setupAndWaitUntilReady();
// Reset metrics.
chrome.metricsPrivate.userActions_ = [];
// Click first row which is 'photos' dir, wait for breadcrumb to show.
assertTrue(test.fakeMouseDoubleClick('#file-list li.table-row'));
await test.waitForElement(
'#location-breadcrumbs .breadcrumb-path:nth-of-type(2)');
// Click breadcrumb to return to parent dir.
assertTrue(test.fakeMouseClick(
'#location-breadcrumbs .breadcrumb-path:nth-of-type(1)'));
await test.waitForFiles(test.TestEntryInfo.getExpectedRows(
test.BASIC_MY_FILES_ENTRY_SET_WITH_LINUX_FILES));
assertArrayEquals(
['FileBrowser.ClickBreadcrumbs'], chrome.metricsPrivate.userActions_);
done();
};
// Copyright 2019 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.
/**
* @fileoverview Tests that breadcrumbs work.
*/
'use strict';
(() => {
testcase.breadcrumbsNavigate = async () => {
const files = [ENTRIES.hello, ENTRIES.photos];
const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS, files, []);
// Navigate to Downloads/photos.
await remoteCall.navigateWithDirectoryTree(
appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
// Use the breadcrumbs to navigate back to Downloads.
await remoteCall.waitAndClickElement(
appId, '#location-breadcrumbs .breadcrumb-path:nth-of-type(2)');
// Wait for the contents of Downloads to load again.
await remoteCall.waitForFiles(appId, TestEntryInfo.getExpectedRows(files));
// A user action should have been recorded for the breadcrumbs.
chrome.test.assertEq(
1, await getUserActionCount('FileBrowser.ClickBreadcrumbs'));
};
})();
// Copyright 2019 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.
/**
* @fileoverview Tests that enum metrics are recorded correctly.
*/
'use strict';
(() => {
testcase.metricsRecordEnum = async () => {
const appId = null;
const histogramName = 'Foo';
const fullHistogramName = `FileBrowser.${histogramName}`;
const validValues = ['a', 'b', 'c'];
const reports = [];
// Record each enumerator once.
for (const value of validValues) {
reports.push(remoteCall.callRemoteTestUtil(
'recordEnumMetric', appId, [histogramName, value, validValues]));
}
await Promise.all(reports);
// Each bucket should contain exactly one sample.
for (let i = 0; i < validValues.length; ++i) {
chrome.test.assertEq(1, await getHistogramCount(fullHistogramName, i));
}
};
})();
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
"test_util.js", "test_util.js",
"remote_call.js", "remote_call.js",
"file_manager/background.js", "file_manager/background.js",
"file_manager/breadcrumbs.js",
"file_manager/context_menu.js", "file_manager/context_menu.js",
"file_manager/copy_between_windows.js", "file_manager/copy_between_windows.js",
"file_manager/create_new_folder.js", "file_manager/create_new_folder.js",
...@@ -31,6 +32,7 @@ ...@@ -31,6 +32,7 @@
"file_manager/keyboard_operations.js", "file_manager/keyboard_operations.js",
"file_manager/launcher_search.js", "file_manager/launcher_search.js",
"file_manager/metadata.js", "file_manager/metadata.js",
"file_manager/metrics.js",
"file_manager/my_files.js", "file_manager/my_files.js",
"file_manager/navigation_list.js", "file_manager/navigation_list.js",
"file_manager/open_audio_files.js", "file_manager/open_audio_files.js",
......
...@@ -1230,3 +1230,29 @@ var ENTRIES = { ...@@ -1230,3 +1230,29 @@ var ENTRIES = {
typeText: 'CRDOWNLOAD file' typeText: 'CRDOWNLOAD file'
}), }),
}; };
/**
* Returns the count for |value| for the histogram |name|.
* @param {string} name The histogram to be queried.
* @param {number} value The value within that histogram to query.
* @return {!Promise<number>} A promise fulfilled with the count.
*/
async function getHistogramCount(name, value) {
return JSON.parse(await sendTestMessage({
'name': 'getHistogramCount',
'histogramName': name,
'value': value,
}));
}
/**
* Returns the count for the user action |name|.
* @param {string} name The user action to be queried.
* @return {!Promise<number>} A promise fulfilled with the count.
*/
async function getUserActionCount(name) {
return JSON.parse(await sendTestMessage({
'name': 'getUserActionCount',
'userActionName': name,
}));
}
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