1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import logging
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import browser_finder
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from telemetry.core import util
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)from telemetry.unittest import options_for_unittests
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from telemetry.unittest import simple_mock
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)_ = simple_mock.DONT_CARE
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _GetCredentialsPath():
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO: This shouldn't depend on tools/perf.
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  credentials_path = os.path.join(util.GetChromiumSrcDir(),
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      'tools', 'perf', 'data', 'credentials.json')
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if not os.path.exists(credentials_path):
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return None
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return credentials_path
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FormBasedCredentialsBackendUnitTestBase(unittest.TestCase):
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def setUp(self):
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._credentials_type = None
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Disabled
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testRealLoginIfPossible(self):
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_path = _GetCredentialsPath()
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if not credentials_path:
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logging.warning('Credentials file not found, skipping test.')
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options = options_for_unittests.GetCopy()
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    with browser_finder.FindBrowser(options).Create() as b:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      b.credentials.credentials_path = credentials_path
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if not b.credentials.CanLogin(self._credentials_type):
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ret = b.credentials.LoginNeeded(b.tabs[0], self._credentials_type)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(ret)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Disabled
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testRealLoginWithDontOverrideProfileIfPossible(self):
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    credentials_path = _GetCredentialsPath()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if not credentials_path:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      logging.warning('Credentials file not found, skipping test.')
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options = options_for_unittests.GetCopy()
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # Login once to make sure our default profile is logged in.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    with browser_finder.FindBrowser(options).Create() as b:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      b.credentials.credentials_path = credentials_path
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if not b.credentials.CanLogin(self._credentials_type):
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab = b.tabs[0]
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Should not be logged in, since this is a fresh credentials
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # instance.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertFalse(b.credentials.IsLoggedIn(self._credentials_type))
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Log in.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ret = b.credentials.LoginNeeded(tab, self._credentials_type)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Make sure login was successful.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(ret)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(b.credentials.IsLoggedIn(self._credentials_type))
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Reset state. Now the backend thinks we're logged out, even
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # though we are logged in in our current browser session. This
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # simulates the effects of running with --dont-override-profile.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      b.credentials._ResetLoggedInState() # pylint: disable=W0212
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Make sure the backend thinks we're logged out.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertFalse(b.credentials.IsLoggedIn(self._credentials_type))
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(b.credentials.CanLogin(self._credentials_type))
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Attempt to login again. This should detect that we've hit
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # the 'logged in' page instead of the login form, and succeed
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # instead of timing out.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ret = b.credentials.LoginNeeded(tab, self._credentials_type)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Make sure our login attempt did in fact succeed and set the
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # backend's internal state to 'logged in'.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(ret)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.assertTrue(b.credentials.IsLoggedIn(self._credentials_type))
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testLoginUsingMock(self):
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    raise NotImplementedError()
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def _LoginUsingMock(self, backend, login_page_url, email_element_id,
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      password_element_id, form_element_id,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      already_logged_in_js): # pylint: disable=R0201
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab = simple_mock.MockObject()
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ar = simple_mock.MockObject()
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    config = {'username': 'blah',
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              'password': 'blargh'}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('Navigate', login_page_url)
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    tab.ExpectCall('EvaluateJavaScript', already_logged_in_js).WillReturn(False)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('WaitForDocumentReadyStateToBeInteractiveOrBetter')
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ar.ExpectCall('WaitForJavaScriptCondition',
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  '(document.querySelector("#%s") !== null) || (%s)' % (
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      form_element_id, already_logged_in_js), 60)
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ar.ExpectCall('WaitForNavigate')
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def VerifyEmail(js):
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      assert email_element_id in js
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      assert 'blah' in js
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('ExecuteJavaScript', _).WhenCalled(VerifyEmail)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def VerifyPw(js):
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      assert password_element_id in js
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      assert 'largh' in js
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('ExecuteJavaScript', _).WhenCalled(VerifyPw)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def VerifySubmit(js):
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      assert '.submit' in js or '.click' in js
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('ExecuteJavaScript', _).WhenCalled(VerifySubmit)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # Checking for form still up.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExpectCall('EvaluateJavaScript', _).WillReturn(False)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    backend.LoginNeeded(tab, ar, config)
133