git_cl: Add the ability to set the description. (reland)

BUG=607359

Review-Url: https://codereview.chromium.org/1935653002

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@300366 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 571be65..f23935b 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -21,6 +21,19 @@
 import git_footers
 import subprocess2
 
+class ChangelistMock(object):
+  # A class variable so we can access it when we don't have access to the
+  # instance that's being set.
+  desc = ""
+  def __init__(self, **kwargs):
+    pass
+  def GetIssue(self):
+    return 1
+  def GetDescription(self):
+    return ChangelistMock.desc
+  def UpdateDescription(self, desc):
+    ChangelistMock.desc = desc
+
 class PresubmitMock(object):
   def __init__(self, *args, **kwargs):
     self.reviewers = []
@@ -1385,15 +1398,8 @@
     out = StringIO.StringIO()
     self.mock(git_cl.sys, 'stdout', out)
 
-    class MockChangelist():
-      def __init__(self, **kwargs):
-        pass
-      def GetIssue(self):
-        return 1
-      def GetDescription(self):
-        return 'foo'
-
-    self.mock(git_cl, 'Changelist', MockChangelist)
+    self.mock(git_cl, 'Changelist', ChangelistMock)
+    ChangelistMock.desc = 'foo\n'
 
     self.assertEqual(0, git_cl.main(['description', '-d']))
     self.assertEqual('foo\n', out.getvalue())
@@ -1423,6 +1429,26 @@
         'description', 'https://code.review.org/123123', '-d', '--gerrit']))
     self.assertEqual('foobar\n', out.getvalue())
 
+  def test_description_set_raw(self):
+    out = StringIO.StringIO()
+    self.mock(git_cl.sys, 'stdout', out)
+
+    self.mock(git_cl, 'Changelist', ChangelistMock)
+    self.mock(git_cl.sys, 'stdin', StringIO.StringIO('hihi'))
+
+    self.assertEqual(0, git_cl.main(['description', '-n', 'hihi']))
+    self.assertEqual('hihi', ChangelistMock.desc)
+
+  def test_description_set_stdin(self):
+    out = StringIO.StringIO()
+    self.mock(git_cl.sys, 'stdout', out)
+
+    self.mock(git_cl, 'Changelist', ChangelistMock)
+    self.mock(git_cl.sys, 'stdin', StringIO.StringIO('hi \r\n\t there\n\nman'))
+
+    self.assertEqual(0, git_cl.main(['description', '-n', '-']))
+    self.assertEqual('hi\n\t there\n\nman', ChangelistMock.desc)
+
 
 if __name__ == '__main__':
   git_cl.logging.basicConfig(