Add a latestbuild pathway to the devserver.

This utilizes code in devserver_util to display the latest build.
Add an option for checking for a particular milestone, this will be helpful
once all branches catch up and are staged in the same target dir.

Add some more error checking and unittests for GetLatestBuild.
Fix a random autoupdate_unittest bug.

Remove FindBuild and its unittests.

TEST=unitests and local tests.
BUG=chromium-os:27719

Change-Id: I2b99a0e47a963fc528c1ad4bac49e340a24a9480
Reviewed-on: https://gerrit.chromium.org/gerrit/18556
Commit-Ready: Scott Zawalski <scottz@chromium.org>
Reviewed-by: Scott Zawalski <scottz@chromium.org>
Tested-by: Scott Zawalski <scottz@chromium.org>
diff --git a/devserver_util_test.py b/devserver_util_test.py
index d0aad9d..42e8f86 100755
--- a/devserver_util_test.py
+++ b/devserver_util_test.py
@@ -19,7 +19,8 @@
 # Fake Dev Server Layout:
 TEST_LAYOUT = {
     'test-board-1': ['R17-1413.0.0-a1-b1346', 'R17-18.0.0-a1-b1346'],
-    'test-board-2': ['R16-2241.0.0-a0-b2', 'R17-2.0.0-a1-b1346']
+    'test-board-2': ['R16-2241.0.0-a0-b2', 'R17-2.0.0-a1-b1346'],
+    'test-board-3': []
 }
 
 
@@ -161,6 +162,7 @@
   def testPrepareAutotestPkgs(self):
     # TODO(frankf): Implement this test
     # self.fail('Not implemented.')
+    # TODO: implement
     pass
 
   def testSafeSandboxAccess(self):
@@ -237,32 +239,25 @@
         devserver_util.GetLatestBuildVersion(self._static_dir, 'test-board-1'),
         'R17-1413.0.0-a1-b1346')
 
-  def testFindBuild(self):
-    # Ensure no matching boards raises exception for latest.
-    self.assertRaises(
-        devserver_util.DevServerUtilError, devserver_util.FindBuild,
-        self._static_dir, 'aasdf', 'latest')
+  def testGetLatestBuildVersionLatest(self):
+    """Test that we raise DevServerUtilError when a build dir is empty."""
+    self.assertRaises(devserver_util.DevServerUtilError,
+                      devserver_util.GetLatestBuildVersion,
+                      self._static_dir, 'test-board-3')
 
-    # Ensure no matching builds or boards raises an exception.
-    self.assertRaises(
-        devserver_util.DevServerUtilError, devserver_util.FindBuild,
-        self._static_dir, 'aasdf', 'asdgsadg')
+  def testGetLatestBuildVersionUnknownBuild(self):
+    """Test that we raise DevServerUtilError when a build dir does not exist."""
+    self.assertRaises(devserver_util.DevServerUtilError,
+                      devserver_util.GetLatestBuildVersion,
+                      self._static_dir, 'bad-dir')
 
-    # Ensure latest returns the proper build.
-    self.assertEqual(
-        devserver_util.FindBuild(self._static_dir, 'test-board-1', 'latest'),
-        ('test-board-1', 'R17-1413.0.0-a1-b1346'))
-
-    # Ensure specific board, build is returned.
-    self.assertEqual(
-        devserver_util.FindBuild(self._static_dir, 'test-board-1',
-                                 'R17-18.0.0-a1-b1346'),
-        ('test-board-1', 'R17-18.0.0-a1-b1346'))
-
-    # Ensure too many matches raises an exception.
-    self.assertRaises(
-        devserver_util.DevServerUtilError, devserver_util.FindBuild,
-        self._static_dir, 'test-board', 'R17')
+  def testGetLatestBuildVersionMilestone(self):
+    """Test that we can get builds based on milestone."""
+    expected_build_str = 'R16-2241.0.0-a0-b2'
+    milestone = 'R16'
+    build_str = devserver_util.GetLatestBuildVersion(
+        self._static_dir, 'test-board-2', milestone)
+    self.assertEqual(expected_build_str, build_str)
 
   def testCloneBuild(self):
     test_prefix = 'abc'