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:
Eugen Sawin 2019-12-20 16:27:06 +00:00
parent 85d70f0acf
commit 4d78316996
3 changed files with 275 additions and 15 deletions

View file

@ -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>

View file

@ -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"

View file

@ -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)
}
}