git-cl: Fix Python 3 bugs

- Don't encode description when calling presubmit,
  codecs.open already takes care of that.
- Don't use raw_input on Python 3
- Encode stdin when calling clang-format.

Bug: 1058318, 1058318
Change-Id: I825422e160c00b33b2c52b6e64e5f0a3e44606f7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2086631
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 87dcb3b..aa56a3a 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -48,13 +48,6 @@
 def callError(code=1, cmd='', cwd='', stdout=b'', stderr=b''):
   return subprocess2.CalledProcessError(code, cmd, cwd, stdout, stderr)
 
-
-def _constantFn(return_value):
-  def f(*args, **kwargs):
-    return return_value
-  return f
-
-
 CERR1 = callError(1)
 
 
@@ -663,9 +656,6 @@
         'git_cl.SaveDescriptionBackup',
         lambda _: self._mocked_call('SaveDescriptionBackup')).start()
     mock.patch(
-        'git_cl.ask_for_data',
-        lambda prompt: self._mocked_call('ask_for_data', prompt)).start()
-    mock.patch(
         'git_cl.write_json',
         lambda *a: self._mocked_call('write_json', *a)).start()
     mock.patch(
@@ -769,12 +759,13 @@
       result = result.encode('utf-8')
     return result
 
+  @mock.patch('sys.stdin', StringIO('blah\nye\n'))
+  @mock.patch('sys.stdout', StringIO())
   def test_ask_for_explicit_yes_true(self):
-    self.calls = [
-        (('ask_for_data', 'prompt [Yes/No]: '), 'blah'),
-        (('ask_for_data', 'Please, type yes or no: '), 'ye'),
-    ]
     self.assertTrue(git_cl.ask_for_explicit_yes('prompt'))
+    self.assertEqual(
+        'prompt [Yes/No]: Please, type yes or no: ',
+        sys.stdout.getvalue())
 
   def test_LoadCodereviewSettingsFromFile_gerrit(self):
     codereview_file = StringIO('GERRIT_HOST: true')
@@ -1193,6 +1184,9 @@
     mock.patch('git_cl.Changelist.GitSanityChecks', return_value=True).start()
     mock.patch(
         'git_cl.Changelist.GetLocalDescription', return_value='foo').start()
+    mock.patch(
+        'git_cl.ask_for_data',
+        lambda prompt: self._mocked_call('ask_for_data', prompt)).start()
 
     self.mockGit.config['gerrit.host'] = 'true'
     self.mockGit.config['branch.master.gerritissue'] = (
@@ -1473,7 +1467,8 @@
 
   @mock.patch('git_cl.RunGit')
   @mock.patch('git_cl.CMDupload')
-  @mock.patch('git_cl.ask_for_data')
+  @mock.patch('sys.stdin', StringIO('\n'))
+  @mock.patch('sys.stdout', StringIO())
   def test_upload_branch_deps(self, *_mocks):
     def mock_run_git(*args, **_kwargs):
       if args[0] == ['for-each-ref',
@@ -1511,10 +1506,11 @@
     ret = git_cl.upload_branch_deps(MockChangelist(), [])
     # CMDupload should have been called 5 times because of 5 dependent branches.
     self.assertEqual(5, len(git_cl.CMDupload.mock_calls))
-    git_cl.ask_for_data.assert_called_once_with(
+    self.assertIn(
         'This command will checkout all dependent branches '
         'and run "git cl upload". Press Enter to continue, '
-        'or Ctrl+C to abort')
+        'or Ctrl+C to abort',
+        sys.stdout.getvalue())
     self.assertEqual(0, ret)
 
   def test_gerrit_change_id(self):
@@ -1843,6 +1839,9 @@
     self.assertEqual(1, git_cl.main(['checkout', '99999']))
 
   def _test_gerrit_ensure_authenticated_common(self, auth):
+    mock.patch(
+        'git_cl.ask_for_data',
+        lambda prompt: self._mocked_call('ask_for_data', prompt)).start()
     mock.patch('git_cl.gerrit_util.CookiesAuthenticator',
               CookiesAuthenticatorMockFactory(hosts_with_creds=auth)).start()
     self.mockGit.config['remote.origin.url'] = (
@@ -2236,6 +2235,9 @@
     mock.patch(
         'git_cl.gclient_utils.rm_file_or_tree',
         lambda path: self._mocked_call(['rm_file_or_tree', path])).start()
+    mock.patch(
+        'git_cl.ask_for_data',
+        lambda prompt: self._mocked_call('ask_for_data', prompt)).start()
     return git_cl.Changelist(issue=123)
 
   def test_GerritCommitMsgHookCheck_custom_hook(self):
@@ -2385,6 +2387,9 @@
         return self._mocked_call('os.path.exists', '%s/%s' % (dirname, base))
       # git cl also checks for existence other files not relevant to this test.
       return None
+    mock.patch(
+        'git_cl.ask_for_data',
+        lambda prompt: self._mocked_call('ask_for_data', prompt)).start()
     mock.patch('os.path.exists', exists_mock).start()
 
   def test_creds_check_gitcookies_not_configured(self):
@@ -2852,7 +2857,7 @@
         '--description_file', '/tmp/fake-temp1',
     ])
     gclient_utils.FileWrite.assert_called_once_with(
-        '/tmp/fake-temp1', b'description', mode='wb')
+        '/tmp/fake-temp1', 'description')
     metrics.collector.add_repeated('sub_commands', {
       'command': 'presubmit',
       'execution_time': 100,
@@ -2896,7 +2901,7 @@
         '--description_file', '/tmp/fake-temp1',
     ])
     gclient_utils.FileWrite.assert_called_once_with(
-        '/tmp/fake-temp1', b'description', mode='wb')
+        '/tmp/fake-temp1', 'description')
 
 
 class CMDTestCaseBase(unittest.TestCase):
@@ -3463,6 +3468,13 @@
     self.assertEqual(expected, git_cl._FilterYapfIgnoredFiles(
         files, git_cl._GetYapfIgnorePatterns(self._top_dir)))
 
+  def _run_command_mock(self, return_value):
+    def f(*args, **kwargs):
+      if 'stdin' in kwargs:
+        self.assertIsInstance(kwargs['stdin'], bytes)
+      return return_value
+    return f
+
   def testClangFormatDiffFull(self):
     self._make_temp_file('test.cc', ['// test'])
     git_cl.settings.GetFormatFullByDefault.return_value = False
@@ -3470,13 +3482,13 @@
     mock_opts = mock.Mock(full=True, dry_run=True, diff=False)
 
     # Diff
-    git_cl.RunCommand.return_value = '  // test'
+    git_cl.RunCommand.side_effect = self._run_command_mock('  // test')
     return_value = git_cl._RunClangFormatDiff(mock_opts, diff_file,
                                               self._top_dir, 'HEAD')
     self.assertEqual(2, return_value)
 
     # No diff
-    git_cl.RunCommand.return_value = '// test'
+    git_cl.RunCommand.side_effect = self._run_command_mock('// test')
     return_value = git_cl._RunClangFormatDiff(mock_opts, diff_file,
                                               self._top_dir, 'HEAD')
     self.assertEqual(0, return_value)
@@ -3486,13 +3498,13 @@
     mock_opts = mock.Mock(full=False, dry_run=True, diff=False)
 
     # Diff
-    git_cl.RunCommand.return_value = 'error'
-    return_value = git_cl._RunClangFormatDiff(mock_opts, ['.'], self._top_dir,
-                                              'HEAD')
+    git_cl.RunCommand.side_effect = self._run_command_mock('error')
+    return_value = git_cl._RunClangFormatDiff(
+        mock_opts, ['.'], self._top_dir, 'HEAD')
     self.assertEqual(2, return_value)
 
     # No diff
-    git_cl.RunCommand.return_value = ''
+    git_cl.RunCommand.side_effect = self._run_command_mock('')
     return_value = git_cl._RunClangFormatDiff(mock_opts, ['.'], self._top_dir,
                                               'HEAD')
     self.assertEqual(0, return_value)