forked from mirrors/gecko-dev
Bug 1599873 - [3.1] Add Login Storage Save API tests. r=geckoview-reviewers,snorp
Differential Revision: https://phabricator.services.mozilla.com/D57643 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
85d70f0acf
commit
4d78316996
3 changed files with 275 additions and 15 deletions
|
|
@ -0,0 +1,13 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Forms</title>
|
||||
<meta name="viewport" content="minimum-scale=1,width=device-width">
|
||||
</head>
|
||||
<body>
|
||||
<form id="form1">
|
||||
<input type="text" id="user1" placeholder="username">
|
||||
<input type="password" id="pass1" placeholder="password">
|
||||
<input type="submit" value="submit">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -31,6 +31,7 @@ open class BaseSessionTest(noErrorCollector: Boolean = false) {
|
|||
const val DOWNLOAD_HTML_PATH = "/assets/www/download.html"
|
||||
const val FORMS_HTML_PATH = "/assets/www/forms.html"
|
||||
const val FORMS2_HTML_PATH = "/assets/www/forms2.html"
|
||||
const val FORMS3_HTML_PATH = "/assets/www/forms3.html"
|
||||
const val HELLO_HTML_PATH = "/assets/www/hello.html"
|
||||
const val HELLO2_HTML_PATH = "/assets/www/hello2.html"
|
||||
const val HELLO_IFRAME_HTML_PATH = "/assets/www/iframe_hello.html"
|
||||
|
|
|
|||
|
|
@ -9,22 +9,29 @@ import android.support.test.runner.AndroidJUnit4
|
|||
|
||||
import org.hamcrest.Matchers.*
|
||||
|
||||
import org.junit.Ignore
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
import org.mozilla.geckoview.GeckoResult
|
||||
import org.mozilla.geckoview.GeckoSession
|
||||
import org.mozilla.geckoview.GeckoSession.PromptDelegate
|
||||
import org.mozilla.geckoview.GeckoSession.PromptDelegate.LoginStoragePrompt
|
||||
import org.mozilla.geckoview.LoginStorage
|
||||
import org.mozilla.geckoview.LoginStorage.LoginEntry
|
||||
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled
|
||||
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.WithDisplay
|
||||
import org.mozilla.geckoview.test.util.Callbacks
|
||||
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
@MediumTest
|
||||
class LoginStorageDelegateTest : BaseSessionTest() {
|
||||
|
||||
@Test fun fetchLogins() {
|
||||
@Test
|
||||
fun fetchLogins() {
|
||||
sessionRule.setPrefsUntilTestEnd(mapOf(
|
||||
// Enable login management since it's disabled in automation.
|
||||
"signon.rememberSignons" to true,
|
||||
"signon.autofillForms.http" to true))
|
||||
|
||||
|
|
@ -39,22 +46,261 @@ class LoginStorageDelegateTest : BaseSessionTest() {
|
|||
val fetchHandled = GeckoResult<Void>()
|
||||
|
||||
sessionRule.addExternalDelegateDuringNextWait(
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginFetch(domain: String)
|
||||
: GeckoResult<Array<LoginEntry>>? {
|
||||
assertThat(
|
||||
"Domain should match",
|
||||
domain,
|
||||
equalTo("localhost"))
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginFetch(domain: String)
|
||||
: GeckoResult<Array<LoginEntry>>? {
|
||||
assertThat("Domain should match", domain, equalTo("localhost"))
|
||||
|
||||
fetchHandled.complete(null);
|
||||
return null
|
||||
}
|
||||
})
|
||||
fetchHandled.complete(null);
|
||||
return null
|
||||
}
|
||||
})
|
||||
|
||||
mainSession.loadTestPath(FORMS_HTML_PATH)
|
||||
mainSession.loadTestPath(FORMS3_HTML_PATH)
|
||||
sessionRule.waitForResult(fetchHandled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun loginSaveDismiss() {
|
||||
sessionRule.setPrefsUntilTestEnd(mapOf(
|
||||
// Enable login management since it's disabled in automation.
|
||||
"signon.rememberSignons" to true,
|
||||
"signon.autofillForms.http" to true,
|
||||
"signon.userInputRequiredToCapture.enabled" to false))
|
||||
|
||||
val runtime = sessionRule.runtime;
|
||||
val register = { delegate: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = delegate
|
||||
}
|
||||
val unregister = { _: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = null
|
||||
}
|
||||
|
||||
sessionRule.addExternalDelegateDuringNextWait(
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginFetch(domain: String)
|
||||
: GeckoResult<Array<LoginEntry>>? {
|
||||
assertThat("Domain should match", domain, equalTo("localhost"))
|
||||
|
||||
return null
|
||||
}
|
||||
})
|
||||
|
||||
mainSession.loadTestPath(FORMS3_HTML_PATH)
|
||||
mainSession.waitForPageStop()
|
||||
|
||||
sessionRule.addExternalDelegateUntilTestEnd(
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled(count = 0)
|
||||
override fun onLoginSave(login: LoginEntry) {}
|
||||
})
|
||||
|
||||
// Assign login credentials.
|
||||
mainSession.evaluateJS("document.querySelector('#user1').value = 'user1x'")
|
||||
mainSession.evaluateJS("document.querySelector('#pass1').value = 'pass1x'")
|
||||
|
||||
// Submit the form.
|
||||
mainSession.evaluateJS("document.querySelector('#form1').submit()")
|
||||
|
||||
sessionRule.waitUntilCalled(object : Callbacks.PromptDelegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginStoragePrompt(
|
||||
session: GeckoSession,
|
||||
prompt: LoginStoragePrompt)
|
||||
: GeckoResult<PromptDelegate.PromptResponse>? {
|
||||
val login = prompt.logins[0]
|
||||
|
||||
assertThat("Session should not be null", session, notNullValue())
|
||||
assertThat(
|
||||
"Type should match",
|
||||
prompt.type,
|
||||
equalTo(LoginStoragePrompt.Type.SAVE))
|
||||
assertThat("Login should not be null", login, notNullValue())
|
||||
assertThat(
|
||||
"Username should match",
|
||||
login.username,
|
||||
equalTo("user1x"))
|
||||
|
||||
assertThat(
|
||||
"Password should match",
|
||||
login.password,
|
||||
equalTo("pass1x"))
|
||||
|
||||
return GeckoResult.fromValue(prompt.dismiss())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@Test
|
||||
fun loginSaveAccept() {
|
||||
sessionRule.setPrefsUntilTestEnd(mapOf(
|
||||
// Enable login management since it's disabled in automation.
|
||||
"signon.rememberSignons" to true,
|
||||
"signon.autofillForms.http" to true,
|
||||
"signon.userInputRequiredToCapture.enabled" to false))
|
||||
|
||||
val runtime = sessionRule.runtime;
|
||||
val register = { delegate: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = delegate
|
||||
}
|
||||
val unregister = { _: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = null
|
||||
}
|
||||
|
||||
mainSession.loadTestPath(FORMS3_HTML_PATH)
|
||||
mainSession.waitForPageStop()
|
||||
|
||||
val saveHandled = GeckoResult<Void>()
|
||||
|
||||
sessionRule.addExternalDelegateUntilTestEnd(
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled
|
||||
override fun onLoginSave(login: LoginEntry) {
|
||||
assertThat(
|
||||
"Username should match",
|
||||
login.username,
|
||||
equalTo("user1x"))
|
||||
|
||||
assertThat(
|
||||
"Password should match",
|
||||
login.password,
|
||||
equalTo("pass1x"))
|
||||
|
||||
saveHandled.complete(null)
|
||||
}
|
||||
})
|
||||
|
||||
sessionRule.delegateDuringNextWait(object : Callbacks.PromptDelegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginStoragePrompt(
|
||||
session: GeckoSession,
|
||||
prompt: LoginStoragePrompt)
|
||||
: GeckoResult<PromptDelegate.PromptResponse>? {
|
||||
assertThat("Session should not be null", session, notNullValue())
|
||||
assertThat(
|
||||
"Type should match",
|
||||
prompt.type,
|
||||
equalTo(LoginStoragePrompt.Type.SAVE))
|
||||
|
||||
val login = prompt.logins[0]
|
||||
|
||||
assertThat("Login should not be null", login, notNullValue())
|
||||
|
||||
assertThat(
|
||||
"Username should match",
|
||||
login.username,
|
||||
equalTo("user1x"))
|
||||
|
||||
assertThat(
|
||||
"Password should match",
|
||||
login.password,
|
||||
equalTo("pass1x"))
|
||||
|
||||
return GeckoResult.fromValue(prompt.confirm(login))
|
||||
}
|
||||
})
|
||||
|
||||
// Assign login credentials.
|
||||
mainSession.evaluateJS("document.querySelector('#user1').value = 'user1x'")
|
||||
mainSession.evaluateJS("document.querySelector('#pass1').value = 'pass1x'")
|
||||
|
||||
// Submit the form.
|
||||
mainSession.evaluateJS("document.querySelector('#form1').submit()")
|
||||
|
||||
sessionRule.waitForResult(saveHandled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun loginSaveModifyAccept() {
|
||||
sessionRule.setPrefsUntilTestEnd(mapOf(
|
||||
// Enable login management since it's disabled in automation.
|
||||
"signon.rememberSignons" to true,
|
||||
"signon.autofillForms.http" to true,
|
||||
"signon.userInputRequiredToCapture.enabled" to false))
|
||||
|
||||
val runtime = sessionRule.runtime;
|
||||
val register = { delegate: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = delegate
|
||||
}
|
||||
val unregister = { _: LoginStorage.Delegate ->
|
||||
runtime.loginStorageDelegate = null
|
||||
}
|
||||
|
||||
mainSession.loadTestPath(FORMS3_HTML_PATH)
|
||||
mainSession.waitForPageStop()
|
||||
|
||||
val saveHandled = GeckoResult<Void>()
|
||||
|
||||
sessionRule.addExternalDelegateUntilTestEnd(
|
||||
LoginStorage.Delegate::class, register, unregister,
|
||||
object : LoginStorage.Delegate {
|
||||
@AssertCalled
|
||||
override fun onLoginSave(login: LoginEntry) {
|
||||
assertThat(
|
||||
"Username should match",
|
||||
login.username,
|
||||
equalTo("user1x"))
|
||||
|
||||
assertThat(
|
||||
"Password should match",
|
||||
login.password,
|
||||
equalTo("pass1xmod"))
|
||||
|
||||
saveHandled.complete(null)
|
||||
}
|
||||
})
|
||||
|
||||
sessionRule.delegateDuringNextWait(object : Callbacks.PromptDelegate {
|
||||
@AssertCalled(count = 1)
|
||||
override fun onLoginStoragePrompt(
|
||||
session: GeckoSession,
|
||||
prompt: LoginStoragePrompt)
|
||||
: GeckoResult<PromptDelegate.PromptResponse>? {
|
||||
assertThat("Session should not be null", session, notNullValue())
|
||||
assertThat(
|
||||
"Type should match",
|
||||
prompt.type,
|
||||
equalTo(LoginStoragePrompt.Type.SAVE))
|
||||
|
||||
val login = prompt.logins[0]
|
||||
|
||||
assertThat("Login should not be null", login, notNullValue())
|
||||
|
||||
assertThat(
|
||||
"Username should match",
|
||||
login.username,
|
||||
equalTo("user1x"))
|
||||
|
||||
assertThat(
|
||||
"Password should match",
|
||||
login.password,
|
||||
equalTo("pass1x"))
|
||||
|
||||
val modLogin = LoginEntry.Builder()
|
||||
.origin(login.origin)
|
||||
.formActionOrigin(login.origin)
|
||||
.httpRealm(login.httpRealm)
|
||||
.username(login.username)
|
||||
.password("pass1xmod")
|
||||
.build()
|
||||
|
||||
return GeckoResult.fromValue(prompt.confirm(modLogin))
|
||||
}
|
||||
})
|
||||
|
||||
// Assign login credentials.
|
||||
mainSession.evaluateJS("document.querySelector('#user1').value = 'user1x'")
|
||||
mainSession.evaluateJS("document.querySelector('#pass1').value = 'pass1x'")
|
||||
|
||||
// Submit the form.
|
||||
mainSession.evaluateJS("document.querySelector('#form1').submit()")
|
||||
|
||||
sessionRule.waitForResult(saveHandled)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue