[autotest] Provide a more flexible dynamic_suite API

In practice, we will frequently be running control files from branches
in a ToT autotest environment.  In order to avoid being unable to
update and improve the dynamic_suite stuff, provide an API
that accepts **dargs.  This way, we can be sure that deprecated arguments
can be coped with, and that we don't have to worry about positional
arguments changing order.

BUG=chromium-os:26523
TEST=unittests
TEST=./server/autoserv test_suites/dev_harness

Change-Id: Iaf7a8844ea330346b654f9b4f51652b798d0ea9b
Reviewed-on: https://gerrit.chromium.org/gerrit/17123
Commit-Ready: Chris Masone <cmasone@chromium.org>
Reviewed-by: Chris Masone <cmasone@chromium.org>
Tested-by: Chris Masone <cmasone@chromium.org>
diff --git a/server/cros/dynamic_suite_unittest.py b/server/cros/dynamic_suite_unittest.py
index e44abf8..81bb848 100755
--- a/server/cros/dynamic_suite_unittest.py
+++ b/server/cros/dynamic_suite_unittest.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 #
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
@@ -26,6 +26,91 @@
         self.statuses = statuses
 
 
+class DynamicSuiteTest(mox.MoxTestBase):
+    """Unit tests for dynamic_suite module methods.
+
+    @var _DARGS: default args to vet.
+    """
+
+
+    def setUp(self):
+        super(DynamicSuiteTest, self).setUp()
+        self._DARGS = {'name': 'name',
+                       'build': 'build',
+                       'board': 'board',
+                       'job': self.mox.CreateMock(base_job.base_job),
+                       'num': 1,
+                       'pool': 'pool',
+                       'skip_reimage': True,
+                       'add_experimental': False}
+
+
+    def testVetRequiredReimageAndRunArgs(self):
+        """Should verify only that required args are present and correct."""
+        build, board, name, job, _, _, _, _ = \
+            dynamic_suite._vet_reimage_and_run_args(**self._DARGS)
+        self.assertEquals(build, self._DARGS['build'])
+        self.assertEquals(board, self._DARGS['board'])
+        self.assertEquals(name, self._DARGS['name'])
+        self.assertEquals(job, self._DARGS['job'])
+
+
+    def testVetReimageAndRunBuildArgFail(self):
+        """Should fail verification because |build| arg is bad."""
+        self._DARGS['build'] = None
+        self.assertRaises(dynamic_suite.SuiteArgumentException,
+                          dynamic_suite._vet_reimage_and_run_args,
+                          **self._DARGS)
+
+
+    def testVetReimageAndRunBoardArgFail(self):
+        """Should fail verification because |board| arg is bad."""
+        self._DARGS['board'] = None
+        self.assertRaises(dynamic_suite.SuiteArgumentException,
+                          dynamic_suite._vet_reimage_and_run_args,
+                          **self._DARGS)
+
+
+    def testVetReimageAndRunNameArgFail(self):
+        """Should fail verification because |name| arg is bad."""
+        self._DARGS['name'] = None
+        self.assertRaises(dynamic_suite.SuiteArgumentException,
+                          dynamic_suite._vet_reimage_and_run_args,
+                          **self._DARGS)
+
+
+    def testVetReimageAndRunJobArgFail(self):
+        """Should fail verification because |job| arg is bad."""
+        self._DARGS['job'] = None
+        self.assertRaises(dynamic_suite.SuiteArgumentException,
+                          dynamic_suite._vet_reimage_and_run_args,
+                          **self._DARGS)
+
+
+    def testOverrideOptionalReimageAndRunArgs(self):
+        """Should verify that optional args can be overridden."""
+        _, _, _, _, pool, num, skip, expr = \
+            dynamic_suite._vet_reimage_and_run_args(**self._DARGS)
+        self.assertEquals(pool, self._DARGS['pool'])
+        self.assertEquals(num, self._DARGS['num'])
+        self.assertEquals(skip, self._DARGS['skip_reimage'])
+        self.assertEquals(expr, self._DARGS['add_experimental'])
+
+
+    def testDefaultOptionalReimageAndRunArgs(self):
+        """Should verify that optional args get defaults."""
+        del(self._DARGS['pool'])
+        del(self._DARGS['skip_reimage'])
+        del(self._DARGS['add_experimental'])
+        del(self._DARGS['num'])
+        _, _, _, _, pool, num, skip, expr = \
+            dynamic_suite._vet_reimage_and_run_args(**self._DARGS)
+        self.assertEquals(pool, None)
+        self.assertEquals(num, None)
+        self.assertEquals(skip, False)
+        self.assertEquals(expr, True)
+
+
 class ReimagerTest(mox.MoxTestBase):
     """Unit tests for dynamic_suite.Reimager.