Allow easy gmerge overrides for board and devserver_url.

Right now, we only use what's in /etc/lsb-release for gmerge
settings. This is fine for a developer, but now with dev_install
fixed in R27, gmerge has become very useful for devs in dev mode.

The /usr/local override specifically has been long wanted.

Also did a little refactoring and fixed some pylint warnings.

BUG=chromium-os:37782
TEST=Ran it on a stumpy Chrome OS machine after dev_install and using
local workstation to build and install screen w/without options.

Change-Id: Ie1bac164bc8a2e3028bfa449bdbeba85e8bec66a
Reviewed-on: https://gerrit.chromium.org/gerrit/43463
Commit-Queue: Chris Sosa <sosa@chromium.org>
Reviewed-by: Chris Sosa <sosa@chromium.org>
Tested-by: Chris Sosa <sosa@chromium.org>
diff --git a/gmerge_test.py b/gmerge_test.py
index 9e28ed7..eebb346 100755
--- a/gmerge_test.py
+++ b/gmerge_test.py
@@ -6,8 +6,10 @@
 
 """Unit tests for gmerge."""
 
+import mox
 import os
 import unittest
+import urllib2
 
 import gmerge
 
@@ -17,33 +19,64 @@
     self.__dict__.update(dictionary)
 
 
-class GMergeTest(unittest.TestCase):
+class GMergeTest(mox.MoxTestBase):
   """Test for gmerge."""
 
   def setUp(self):
+    super(GMergeTest, self).setUp()
     self.lsb_release_lines = [
         'CHROMEOS_RELEASE_BOARD=x86-mario\r\n',
         'CHROMEOS_DEVSERVER=http://localhost:8080/\n']
 
   def testLsbRelease(self):
-    merger = gmerge.GMerger(self.lsb_release_lines)
-    self.assertEqual({'CHROMEOS_RELEASE_BOARD': 'x86-mario',
-                      'CHROMEOS_DEVSERVER': 'http://localhost:8080/'},
-                     merger.lsb_release)
+    """Basic LSB release parsing test."""
+    merger = gmerge.GMerger(None, None)
+    merger.ParseLsbRelease(self.lsb_release_lines)
+    self.assertEqual(merger.board_name, 'x86-mario')
+    self.assertEqual(merger.devserver_url, 'http://localhost:8080/')
+
+  def testLsbReleaseWithFlagsOverride(self):
+    """Board/url values passed in to constructor should override parsed ones."""
+    override_url = 'http://override:8080'
+    override_board = 'override_board'
+    merger = gmerge.GMerger(override_url, override_board)
+    merger.ParseLsbRelease(self.lsb_release_lines)
+    self.assertEqual(merger.board_name, override_board)
+    self.assertEqual(merger.devserver_url, override_url)
+
+  def testLsbReleaseWithMultipleKeyValCopies(self):
+    """Lsb Release should only use the last val for any key=val combo."""
+    override_url = 'http://override:8080'
+    override_board = 'override_board'
+    lsb_release_lines = self.lsb_release_lines + (
+        ['CHROMEOS_RELEASE_BOARD=%s\r\n' % override_board,
+         'CHROMEOS_DEVSERVER=%s\n' % override_url])
+    merger = gmerge.GMerger(None, None)
+    merger.ParseLsbRelease(lsb_release_lines)
+    self.assertEqual(merger.board_name, override_board)
+    self.assertEqual(merger.devserver_url, override_url)
 
   def testPostData(self):
+    """Validate we construct the data url to the devserver correctly."""
+    self.mox.StubOutWithMock(urllib2, 'urlopen')
     old_env = os.environ
     os.environ = {}
     os.environ['USE'] = 'a b c d +e'
-    gmerge.FLAGS = Flags({'accept_stable': 'blah',
-                          'deep': False,
-                          'usepkg': False})
 
-    merger = gmerge.GMerger(self.lsb_release_lines)
-    self.assertEqual(
-        'use=a+b+c+d+%2Be&board=x86-mario&deep=&pkg=package_name&usepkg=&'
-        'accept_stable=blah',
-        merger.GeneratePackageRequest('package_name'))
+    merger = gmerge.GMerger(None, None)
+    merger.ParseLsbRelease(self.lsb_release_lines)
+
+    # Expected post request.
+    expected_data = ('use=a+b+c+d+%2Be&board=x86-mario&'
+                     'deep=&pkg=package_name&usepkg=&accept_stable=blah')
+
+    mock_object = self.mox.CreateMock(file)
+    urllib2.urlopen(mox.IgnoreArg(), data=expected_data).AndReturn(mock_object)
+    mock_object.read().AndReturn('Build succeeded')
+    mock_object.close()
+    self.mox.ReplayAll()
+    merger.RequestPackageBuild('package_name', False, 'blah', False)
+    self.mox.VerifyAll()
     os.environ = old_env