blob: 87a507a1e14ab6b658a81ea856a683cc98f88a61 [file] [log] [blame]
// Copyright 2017 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.
/** @implements {settings.FingerprintBrowserProxy} */
class TestFingerprintBrowserProxy extends TestBrowserProxy {
constructor() {
super([
'getFingerprintsList',
'getNumFingerprints',
'startEnroll',
'cancelCurrentEnroll',
'getEnrollmentLabel',
'removeEnrollment',
'changeEnrollmentLabel',
'startAuthentication',
'endCurrentAuthentication',
]);
/** @private {!Array<string>} */
this.fingerprintsList_ = [];
}
/** @ param {!Array<string>} fingerprints */
setFingerprints(fingerprints) {
this.fingerprintsList_ = fingerprints.slice();
}
/**
* @param {settings.FingerprintResultType} result
* @param {boolean} complete
* @param {number} percent
*/
scanReceived(result, complete, percent) {
if (complete)
this.fingerprintsList_.push('New Label');
cr.webUIListenerCallback(
'on-fingerprint-scan-received',
{result: result, isComplete: complete, percentComplete: percent});
}
/** @override */
getFingerprintsList() {
this.methodCalled('getFingerprintsList');
/** @type {settings.FingerprintInfo} */
const fingerprintInfo = {
fingerprintsList: this.fingerprintsList_.slice(),
isMaxed: this.fingerprintsList_.length >= 3
};
return Promise.resolve(fingerprintInfo);
}
/** @override */
getNumFingerprints() {
this.methodCalled('getNumFingerprints');
return Promise.resolve(fingerprintsList_.length);
}
/** @override */
startEnroll() {
this.methodCalled('startEnroll');
}
/** @override */
cancelCurrentEnroll() {
this.methodCalled('cancelCurrentEnroll');
}
/** @override */
getEnrollmentLabel(index) {
this.methodCalled('getEnrollmentLabel');
return Promise.resolve(this.fingerprintsList_[index]);
}
/** @override */
removeEnrollment(index) {
this.fingerprintsList_.splice(index, 1);
this.methodCalled('removeEnrollment', index);
return Promise.resolve(true);
}
/** @override */
changeEnrollmentLabel(index, newLabel) {
this.fingerprintsList_[index] = newLabel;
this.methodCalled('changeEnrollmentLabel', index, newLabel);
return Promise.resolve(true);
}
/** @override */
startAuthentication() {
this.methodCalled('startAuthentication');
}
/** @override */
endCurrentAuthentication() {
this.methodCalled('endCurrentAuthentication');
}
}
suite('settings-fingerprint-list', function() {
/** @type {?SettingsFingerprintListElement} */
let fingerprintList = null;
/** @type {?SettingsSetupFingerprintDialogElement} */
let dialog = null;
/** @type {?HTMLButtonElement} */
let addAnotherButton = null;
/** @type {?settings.TestFingerprintBrowserProxy} */
let browserProxy = null;
/**
* @param {number} index
* @param {string=} opt_label
*/
function createFakeEvent(index, opt_label) {
return {model: {index: index, item: opt_label || ''}};
}
function openDialog() {
fingerprintList.$$('.action-button').click();
Polymer.dom.flush();
dialog = fingerprintList.$$('settings-setup-fingerprint-dialog');
addAnotherButton = dialog.$$('#addAnotherButton');
}
/**
* @param {!Element} element
*/
function isVisible(element) {
return element.offsetWidth > 0 && element.offsetHeight > 0;
}
setup(function() {
browserProxy = new TestFingerprintBrowserProxy();
settings.FingerprintBrowserProxyImpl.instance_ = browserProxy;
PolymerTest.clearBody();
fingerprintList = document.createElement('settings-fingerprint-list');
document.body.appendChild(fingerprintList);
Polymer.dom.flush();
return Promise
.all([
browserProxy.whenCalled('startAuthentication'),
browserProxy.whenCalled('getFingerprintsList')
])
.then(function() {
assertEquals(0, fingerprintList.fingerprints_.length);
browserProxy.resetResolver('getFingerprintsList');
});
});
// Verify running through the enroll session workflow
// (settings-setup-fingerprint-dialog) works as expected.
test('EnrollingFingerprint', function() {
openDialog();
return browserProxy.whenCalled('startEnroll').then(function() {
assertTrue(dialog.$$('#dialog').open);
assertEquals(0, dialog.percentComplete_);
assertEquals(settings.FingerprintSetupStep.LOCATE_SCANNER, dialog.step_);
assertFalse(dialog.$$('#scannerLocation').hidden);
assertTrue(dialog.$$('#arc').hidden);
// Message should be shown for LOCATE_SCANNER step.
assertEquals(
'visible',
window.getComputedStyle(dialog.$$('#messageDiv')).visibility);
// First tap on the sensor to start fingerprint enrollment.
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 20 /* percent */);
assertEquals(20, dialog.percentComplete_);
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
assertTrue(dialog.$$('#scannerLocation').hidden);
assertFalse(dialog.$$('#arc').hidden);
// Verify that by sending a scan problem, the div that contains the
// problem message should be visible.
browserProxy.scanReceived(
settings.FingerprintResultType.TOO_FAST, false, 20 /* percent */);
assertEquals(20, dialog.percentComplete_);
assertEquals(
'visible',
window.getComputedStyle(dialog.$$('#messageDiv')).visibility);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 50 /* percent */);
assertEquals(
'hidden',
window.getComputedStyle(dialog.$$('#messageDiv')).visibility);
assertEquals(50, dialog.percentComplete_);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 70 /* percent */);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, true, 100 /* percent */);
assertEquals(settings.FingerprintSetupStep.READY, dialog.step_);
// Message should be shown for READY step.
assertEquals(
'visible',
window.getComputedStyle(dialog.$$('#messageDiv')).visibility);
// Verify that by tapping the continue button we should exit the dialog
// and the fingerprint list should have one fingerprint registered.
dialog.$$('#closeButton').click();
return PolymerTest.flushTasks().then(function() {
Promise
.all([
browserProxy.whenCalled('startAuthentication'),
browserProxy.whenCalled('getFingerprintsList')
])
.then(function() {
assertEquals(1, fingerprintList.fingerprints_.length);
});
});
});
});
// Verify enrolling a fingerprint, then enrolling another without closing the
// dialog works as intended.
test('EnrollingAnotherFingerprint', function() {
openDialog();
return browserProxy.whenCalled('startEnroll')
.then(function() {
browserProxy.resetResolver('startEnroll');
assertTrue(dialog.$$('#dialog').open);
assertEquals(0, dialog.percentComplete_);
assertFalse(isVisible(addAnotherButton));
assertEquals(
settings.FingerprintSetupStep.LOCATE_SCANNER, dialog.step_);
// First tap on the sensor to start fingerprint enrollment.
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 20 /* percent */);
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, true, 100 /* percent */);
assertEquals(settings.FingerprintSetupStep.READY, dialog.step_);
assertTrue(dialog.$$('#dialog').open);
assertTrue(isVisible(addAnotherButton));
addAnotherButton.click();
// Once the first fingerprint is enrolled, verify that enrolling the
// second fingerprint without closing the dialog works as expected.
return Promise.all([
browserProxy.whenCalled('startEnroll'),
browserProxy.whenCalled('getFingerprintsList')
]);
})
.then(function() {
browserProxy.resetResolver('getFingerprintsList');
assertTrue(dialog.$$('#dialog').open);
assertFalse(isVisible(addAnotherButton));
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
assertTrue(dialog.$$('#scannerLocation').hidden);
assertFalse(dialog.$$('#arc').hidden);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, true, 100 /* percent */);
// Verify that by tapping the continue button we should exit the
// dialog and the fingerprint list should have two fingerprints
// registered.
dialog.$$('#closeButton').click();
return browserProxy.whenCalled('getFingerprintsList');
})
.then(function() {
assertEquals(2, fingerprintList.fingerprints_.length);
});
});
// Verify after third fingerprint is enrolled, add another button in the
// setup dialog is hidden.
test('EnrollingThirdFingerprint', function() {
browserProxy.setFingerprints(['1', '2']);
fingerprintList.updateFingerprintsList_();
openDialog();
return browserProxy.whenCalled('startEnroll')
.then(function() {
browserProxy.resetResolver('startEnroll');
assertTrue(dialog.$$('#dialog').open);
assertEquals(0, dialog.percentComplete_);
assertFalse(isVisible(addAnotherButton));
assertEquals(
settings.FingerprintSetupStep.LOCATE_SCANNER, dialog.step_);
// First tap on the sensor to start fingerprint enrollment.
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 20 /* percent */);
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, true, 100 /* percent */);
assertEquals(settings.FingerprintSetupStep.READY, dialog.step_);
return browserProxy.whenCalled('getFingerprintsList');
})
.then(function() {
browserProxy.resetResolver('getFingerprintsList');
// Add another is hidden after third fingerprint is enrolled.
assertTrue(dialog.$$('#dialog').open);
assertFalse(isVisible(addAnotherButton));
assertEquals(3, fingerprintList.fingerprints_.length);
});
});
test('CancelEnrollingFingerprint', function() {
openDialog();
return browserProxy.whenCalled('startEnroll')
.then(function() {
assertTrue(dialog.$$('#dialog').open);
assertEquals(0, dialog.percentComplete_);
assertEquals(
settings.FingerprintSetupStep.LOCATE_SCANNER, dialog.step_);
// First tap on the sensor to start fingerprint enrollment.
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 20 /* percent */);
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
browserProxy.scanReceived(
settings.FingerprintResultType.SUCCESS, false, 30 /* percent */);
assertEquals(30, dialog.percentComplete_);
assertEquals(settings.FingerprintSetupStep.MOVE_FINGER, dialog.step_);
// Verify that by tapping the exit button we should exit the dialog
// and the fingerprint list should have zero fingerprints registered.
dialog.$$('#closeButton').click();
return Promise.all([
browserProxy.whenCalled('cancelCurrentEnroll'),
browserProxy.whenCalled('startAuthentication')
]);
})
.then(function() {
assertEquals(0, fingerprintList.fingerprints_.length);
});
});
test('RemoveFingerprint', function() {
browserProxy.setFingerprints(['Label 1', 'Label 2']);
fingerprintList.updateFingerprintsList_();
return browserProxy.whenCalled('getFingerprintsList')
.then(function() {
browserProxy.resetResolver('getFingerprintsList');
assertEquals(2, fingerprintList.fingerprints_.length);
fingerprintList.onFingerprintDeleteTapped_(createFakeEvent(0));
return Promise.all([
browserProxy.whenCalled('removeEnrollment'),
browserProxy.whenCalled('getFingerprintsList')
]);
})
.then(function() {
assertEquals(1, fingerprintList.fingerprints_.length);
});
});
test('ChangeFingerprintLabel', function() {
browserProxy.setFingerprints(['Label 1']);
fingerprintList.updateFingerprintsList_();
return browserProxy.whenCalled('getFingerprintsList')
.then(function() {
assertEquals(1, fingerprintList.fingerprints_.length);
assertEquals('Label 1', fingerprintList.fingerprints_[0]);
// Verify that by sending a fingerprint input change event, the new
// label gets changed as expected.
fingerprintList.onFingerprintLabelChanged_(
createFakeEvent(0, 'New Label 1'));
return Promise.all([
browserProxy.whenCalled('changeEnrollmentLabel'),
browserProxy.whenCalled('getFingerprintsList')
]);
})
.then(function() {
assertEquals('New Label 1', fingerprintList.fingerprints_[0]);
});
});
test('AddingNewFingerprint', function() {
browserProxy.setFingerprints(['1', '2', '3']);
fingerprintList.updateFingerprintsList_();
// Verify that new fingerprints cannot be added when there are already three
// registered fingerprints.
return browserProxy.whenCalled('getFingerprintsList')
.then(function() {
browserProxy.resetResolver('getFingerprintsList');
assertEquals(3, fingerprintList.fingerprints_.length);
assertTrue(fingerprintList.$$('.action-button').disabled);
fingerprintList.onFingerprintDeleteTapped_(createFakeEvent(0));
return Promise.all([
browserProxy.whenCalled('removeEnrollment'),
browserProxy.whenCalled('getFingerprintsList')
]);
})
.then(function() {
assertEquals(2, fingerprintList.fingerprints_.length);
assertFalse(fingerprintList.$$('.action-button').disabled);
});
});
});