blob: 724dcf0bc9dd5af3564e5bc569ab8ed085b51d32 [file]
// Copyright 2020 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 Suite of tests for settings-secure-dns. */
suite('SettingsSecureDns', function() {
/** @type {settings.TestPrivacyPageBrowserProxy} */
let testBrowserProxy;
/** @type {SettingsSecureDnsElement} */
let testElement;
/** @type {SettingsToggleButtonElement} */
let secureDnsToggle;
/** @type {CrRadioGroupElement} */
let secureDnsRadioGroup;
/** @type {!Array<!settings.ResolverOption>} */
const resolverList = [
{name: 'Custom', value: 'custom', policy: ''},
{
name: 'resolver1',
value: 'resolver1_template',
policy: 'https://resolver1_policy.com/'
},
{
name: 'resolver2',
value: 'resolver2_template',
policy: 'https://resolver2_policy.com/'
},
{
name: 'resolver3',
value: 'resolver3_template',
policy: 'https://resolver3_policy.com/'
},
];
// Possible subtitle overrides.
const defaultDescription = 'default description';
const managedEnvironmentDescription =
'disabled for managed environment description';
const parentalControlDescription =
'disabled for parental control description';
/**
* Checks that the radio buttons are shown and the toggle is properly
* configured for showing the radio buttons.
*/
function assertRadioButtonsShown() {
assertTrue(secureDnsToggle.hasAttribute('checked'));
assertFalse(secureDnsToggle.$$('cr-toggle').disabled);
assertFalse(secureDnsRadioGroup.hidden);
}
suiteSetup(function() {
loadTimeData.overrideValues({
showSecureDnsSetting: true,
secureDnsDescription: defaultDescription,
secureDnsDisabledForManagedEnvironment: managedEnvironmentDescription,
secureDnsDisabledForParentalControl: parentalControlDescription,
});
});
setup(async function() {
testBrowserProxy = new TestPrivacyPageBrowserProxy();
testBrowserProxy.setResolverList(resolverList);
settings.PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
PolymerTest.clearBody();
testElement = document.createElement('settings-secure-dns');
testElement.prefs = {
dns_over_https: {
mode: {value: settings.SecureDnsMode.AUTOMATIC},
templates: {value: ''}
},
};
document.body.appendChild(testElement);
await testBrowserProxy.whenCalled('getSecureDnsSetting');
await test_util.flushTasks();
secureDnsToggle = testElement.$$('#secureDnsToggle');
secureDnsRadioGroup = testElement.$$('#secureDnsRadioGroup');
assertRadioButtonsShown();
assertEquals(
testBrowserProxy.secureDnsSetting.mode, secureDnsRadioGroup.selected);
});
teardown(function() {
testElement.remove();
});
test('SecureDnsOff', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.OFF,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertFalse(secureDnsToggle.hasAttribute('checked'));
assertFalse(secureDnsToggle.$$('cr-toggle').disabled);
assertTrue(secureDnsRadioGroup.hidden);
assertEquals(defaultDescription, secureDnsToggle.subLabel);
assertFalse(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
});
test('SecureDnsAutomatic', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.AUTOMATIC,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertRadioButtonsShown();
assertEquals(defaultDescription, secureDnsToggle.subLabel);
assertFalse(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
assertEquals(
settings.SecureDnsMode.AUTOMATIC, secureDnsRadioGroup.selected);
});
test('SecureDnsSecure', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.SECURE,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertRadioButtonsShown();
assertEquals(defaultDescription, secureDnsToggle.subLabel);
assertFalse(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
assertEquals(settings.SecureDnsMode.SECURE, secureDnsRadioGroup.selected);
});
test('SecureDnsManagedEnvironment', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.OFF,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.DISABLED_MANAGED,
});
Polymer.dom.flush();
assertFalse(secureDnsToggle.hasAttribute('checked'));
assertTrue(secureDnsToggle.$$('cr-toggle').disabled);
assertTrue(secureDnsRadioGroup.hidden);
assertEquals(managedEnvironmentDescription, secureDnsToggle.subLabel);
assertTrue(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
assertTrue(secureDnsToggle.$$('cr-policy-pref-indicator')
.$$('cr-tooltip-icon')
.hidden);
});
test('SecureDnsParentalControl', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.OFF,
templates: [],
managementMode:
settings.SecureDnsUiManagementMode.DISABLED_PARENTAL_CONTROLS,
});
Polymer.dom.flush();
assertFalse(secureDnsToggle.hasAttribute('checked'));
assertTrue(secureDnsToggle.$$('cr-toggle').disabled);
assertTrue(secureDnsRadioGroup.hidden);
assertEquals(parentalControlDescription, secureDnsToggle.subLabel);
assertTrue(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
assertTrue(secureDnsToggle.$$('cr-policy-pref-indicator')
.$$('cr-tooltip-icon')
.hidden);
});
test('SecureDnsManaged', function() {
testElement.prefs.dns_over_https.mode.enforcement =
chrome.settingsPrivate.Enforcement.ENFORCED;
testElement.prefs.dns_over_https.mode.controlledBy =
chrome.settingsPrivate.ControlledBy.DEVICE_POLICY;
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.AUTOMATIC,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertTrue(secureDnsToggle.hasAttribute('checked'));
assertTrue(secureDnsToggle.$$('cr-toggle').disabled);
assertTrue(secureDnsRadioGroup.hidden);
assertEquals(defaultDescription, secureDnsToggle.subLabel);
assertTrue(!!secureDnsToggle.$$('cr-policy-pref-indicator'));
assertFalse(secureDnsToggle.$$('cr-policy-pref-indicator')
.$$('cr-tooltip-icon')
.hidden);
});
test('SecureDnsModeChange', function() {
// Start in secure mode.
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.SECURE,
templates: [],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
// Click on the secure dns toggle to disable secure dns.
secureDnsToggle.click();
assertEquals(
settings.SecureDnsMode.OFF,
testElement.prefs.dns_over_https.mode.value);
// Click on the secure dns toggle to enable secure dns.
secureDnsToggle.click();
assertEquals(
settings.SecureDnsMode.SECURE,
testElement.prefs.dns_over_https.mode.value);
// Change the radio button to automatic mode.
secureDnsRadioGroup.querySelector('cr-radio-button').click();
assertEquals(
settings.SecureDnsMode.AUTOMATIC,
testElement.prefs.dns_over_https.mode.value);
// Click on the secure dns toggle to disable secure dns.
secureDnsToggle.click();
assertEquals(
settings.SecureDnsMode.OFF,
testElement.prefs.dns_over_https.mode.value);
// Click on the secure dns toggle to enable secure dns.
secureDnsToggle.click();
assertEquals(
settings.SecureDnsMode.AUTOMATIC,
testElement.prefs.dns_over_https.mode.value);
});
test('SecureDnsDropdown', function() {
const options =
testElement.$$('#secureResolverSelect').querySelectorAll('option');
assertEquals(4, options.length);
for (let i = 0; i < options.length; i++) {
assertEquals(resolverList[i].name, options[i].text);
assertEquals(resolverList[i].value, options[i].value);
}
});
test('SecureDnsDropdownCustom', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.SECURE,
templates: ['custom'],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertRadioButtonsShown();
assertEquals(settings.SecureDnsMode.SECURE, secureDnsRadioGroup.selected);
assertEquals(0, testElement.$$('#secureResolverSelect').selectedIndex);
assertTrue(testElement.$$('#privacyPolicy').hasAttribute('hidden'));
});
test('SecureDnsDropdownChangeInSecureMode', function() {
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.SECURE,
templates: [resolverList[1].value],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertRadioButtonsShown();
assertEquals(settings.SecureDnsMode.SECURE, secureDnsRadioGroup.selected);
const dropdownMenu = testElement.$$('#secureResolverSelect');
const privacyPolicyLine = testElement.$$('#privacyPolicy');
assertEquals(1, dropdownMenu.selectedIndex);
assertFalse(privacyPolicyLine.hasAttribute('hidden'));
assertEquals(
resolverList[1].policy, privacyPolicyLine.querySelector('a').href);
// Change to resolver2
dropdownMenu.value = resolverList[2].value;
dropdownMenu.dispatchEvent(new Event('change'));
assertEquals(2, dropdownMenu.selectedIndex);
assertFalse(privacyPolicyLine.hasAttribute('hidden'));
assertEquals(
resolverList[2].policy, privacyPolicyLine.querySelector('a').href);
assertEquals(
resolverList[2].value,
testElement.prefs.dns_over_https.templates.value);
// Change to custom
dropdownMenu.value = 'custom';
dropdownMenu.dispatchEvent(new Event('change'));
assertEquals(0, dropdownMenu.selectedIndex);
assertTrue(privacyPolicyLine.hasAttribute('hidden'));
assertEquals('custom', testElement.prefs.dns_over_https.templates.value);
});
test('SecureDnsDropdownChangeInAutomaticMode', function() {
testElement.prefs.dns_over_https.templates.value = 'resolver1_template';
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.AUTOMATIC,
templates: [resolverList[1].value],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertRadioButtonsShown();
assertEquals(
settings.SecureDnsMode.AUTOMATIC, secureDnsRadioGroup.selected);
const dropdownMenu = testElement.$$('#secureResolverSelect');
const privacyPolicyLine = testElement.$$('#privacyPolicy');
// Select resolver3. This change should not be reflected in prefs.
assertNotEquals(3, dropdownMenu.selectedIndex);
dropdownMenu.value = resolverList[3].value;
dropdownMenu.dispatchEvent(new Event('change'));
assertEquals(3, dropdownMenu.selectedIndex);
assertFalse(privacyPolicyLine.hasAttribute('hidden'));
assertEquals(
resolverList[3].policy, privacyPolicyLine.querySelector('a').href);
assertEquals(
'resolver1_template', testElement.prefs.dns_over_https.templates.value);
// Click on the secure dns toggle to disable secure dns.
secureDnsToggle.click();
assertTrue(secureDnsRadioGroup.hidden);
assertEquals(
settings.SecureDnsMode.OFF,
testElement.prefs.dns_over_https.mode.value);
assertEquals('', testElement.prefs.dns_over_https.templates.value);
// Get another event enabling automatic mode.
cr.webUIListenerCallback('secure-dns-setting-changed', {
mode: settings.SecureDnsMode.AUTOMATIC,
templates: [resolverList[1].value],
managementMode: settings.SecureDnsUiManagementMode.NO_OVERRIDE,
});
Polymer.dom.flush();
assertFalse(secureDnsRadioGroup.hidden);
assertEquals(3, dropdownMenu.selectedIndex);
assertFalse(privacyPolicyLine.hasAttribute('hidden'));
assertEquals(
resolverList[3].policy, privacyPolicyLine.querySelector('a').href);
// Click on secure mode radio button.
secureDnsRadioGroup.querySelectorAll('cr-radio-button')[1].click();
assertFalse(secureDnsRadioGroup.hidden);
assertEquals(settings.SecureDnsMode.SECURE, secureDnsRadioGroup.selected);
assertEquals(3, dropdownMenu.selectedIndex);
assertFalse(privacyPolicyLine.hasAttribute('hidden'));
assertEquals(
resolverList[3].policy, privacyPolicyLine.querySelector('a').href);
assertEquals(
settings.SecureDnsMode.SECURE,
testElement.prefs.dns_over_https.mode.value);
assertEquals(
'resolver3_template', testElement.prefs.dns_over_https.templates.value);
});
});