factory_SelectKeyboard: allow overriding list from test_list

Each partner may have their own perference for keyboard layout / locale (even
timezone) selection. We should allow setting supported combination from some
where they can edit (i.e., the test list).

The default list is reduced to contain only 4 layouts.

BUG=chromium-os:15190
TEST=run factory_SelectKeyboard; # seeing default keyboard layout list
     edit test_list to assigng kb_map; # seeing modified keyboard layout list

Change-Id: Id416254f67702bbe25e0242380006f7affad96cb
Reviewed-on: http://gerrit.chromium.org/gerrit/667
Reviewed-by: Yusuke Sato <yusukes@chromium.org>
Reviewed-by: Nikita Kostylev <nkostylev@chromium.org>
Reviewed-by: Nick Sanders <nsanders@chromium.org>
Tested-by: Hung-Te Lin <hungte@chromium.org>
diff --git a/client/site_tests/factory_SelectKeyboard/factory_SelectKeyboard.py b/client/site_tests/factory_SelectKeyboard/factory_SelectKeyboard.py
index 92048e4..e95b4af 100644
--- a/client/site_tests/factory_SelectKeyboard/factory_SelectKeyboard.py
+++ b/client/site_tests/factory_SelectKeyboard/factory_SelectKeyboard.py
@@ -1,11 +1,12 @@
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+# Copyright (c) 2011 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.
 
 
 # DESCRIPTION :
 #
-# Select the keyboard type, and write to VPD.
+# Select the keyboard type (and all other locale/timezone information), and
+# write to VPD.
 
 
 import gtk
@@ -20,32 +21,42 @@
 from autotest_lib.client.bin import test
 from autotest_lib.client.common_lib import error
 
-# Mapping between menu choice and KB.
-# Ref: http://git.chromium.org/gitweb/?\
-#  p=chromiumos/platform/assets.git;a=blob;f=input_methods/whitelist.txt;hb=HEAD
-# Ref: http://google.com/codesearch/p?hl=en#\
-#  OAMlx_jo-ck/src/ui/base/l10n/l10n_util.cc\
-#  &q=kAcceptLanguageList&exact_package=chromium&sa=N&cd=1&ct=rc
-kb_map = (
+# TODO(hungte) add timezone
+
+# References
+# - Keyboard: http://git.chromium.org/gitweb/?p=chromiumos/platform/assets.git;a=blob;f=input_methods/whitelist.txt;hb=HEAD
+# - Locale: http://google.com/codesearch/p?#OAMlx_jo-ck/src/ui/base/l10n/l10n_util.cc&q=kAcceptLanguageList
+# - Time Zone: http://google.com/codesearch/p?#OAMlx_jo-ck/src/chrome/browser/ui/webui/options/chromeos/system_settings_provider.cc&q=kTimeZones
+
+# Mapping between menu choice and database.
+DEFAULT_KBD_LAYOUT_MAP = (
   ('', '', 'None (ignore)'),
   ('xkb:us::eng',           'en-US',      'US - English'),
   ('xkb:gb:extd:eng',       'en-GB',      'United Kingdom - English'),
   ('xkb:fr::fra',           'fr-FR',      'France - French'),
   ('xkb:de::ger',           'de-DE',      'Germany - German'),
-  ('xkb:it::ita',           'it-IT',      'Italy - Italian'),
-  ('xkb:pt::por',           'pt-PT',      'Portugal - Portuguese'),
-  ('xkb:es::spa',           'es',         'Spain - Spanish'),
-  ('xkb:nl::nld',           'nl',         'Netherlands - Dutch'),
-  ('xkb:jp::jpn',           'ja',         'Japan - Japanese'),
 
   # Uncomment layouts you need from following list.
 
+  # Netherlands is known to use xkb:us:intl:eng more than xkb:nl:nld.
+  #('xkb:us:intl:eng',       'nl',         'Netherlands - Dutch (US layout)'),
+  #('xkb:nl::nld',           'nl',         'Netherlands - Dutch'),
+
+  # TODO(hungte) Belgium should be nl-BE, de-BE, fr-BE; however these locales
+  # are not supported yet. Add extra locales after Chrome supports them.
+  #('xkb:be::nld',           'nl',         'Belgium - Dutch'),
+  #('xkb:be::ger',           'de',         'Belgium - German'),
   #('xkb:be::fra',           'fr',         'Belgium - French'),
+
+  # TODO(hungte) es419 has same issue as Belgium. Add extra locales after Chrome
+  # supports them.
+  #('xkb:latam::spa',        'es-419',     'Latin America - Spanish'),
+
   #('xkb:ca::fra',           'fr-CA',      'Canada - French'),
   #('xkb:ch:fr:fra',         'fr-CH',      'Switzerland - French'),
   #('xkb:de:neo:ger',        'de',         'Germany - Neo 2'),
-  #('xkb:be::ger',           'de',         'Belgium - German'),
   #('xkb:ch::ger',           'de-CH',      'Switzerland - German'),
+  #('xkb:jp::jpn',           'ja',         'Japan - Japanese'),
   #('xkb:ru::rus',           'ru',         'Russia - Russian'),
   #('xkb:ru:phonetic:rus',   'ru',         'Russia - Phonetic - Russian'),
   #('xkb:us:altgr-intl:eng', 'en-US',      'US - Extended (AltGr) - English'),
@@ -58,20 +69,27 @@
   #('xkb:ca:eng:eng',        'ca',         'Canada - English'),
   #('xkb:cz::cze',           'cs',         'Czech Republic - Czech'),
   #('xkb:ee::est',           'et',         'Estonia - Estonian'),
+  #('xkb:es::spa',           'es',         'Spain - Spanish'),
   #('xkb:es:cat:cat',        'ca',         'Spain - Catalan'),
   #('xkb:dk::dan',           'da',         'Denmark - Danish'),
   #('xkb:gr::gre',           'el',         'Greece - Greek'),
   #('xkb:il::heb',           'iw',         'Israel - Hebrew'),
   #('xkb:kr:kr104:kor',      'ko',   'Korea - Korean (101/104 key Compatible)'),
-  #('xkb:latam::spa',        'es-419',     'Latin America - Spanish'),
   #('xkb:lt::lit',           'lt',         'Lithuania - Lithuanian'),
   #('xkb:lv:apostrophe:lav', 'lv',     'Latvia - Latvian (Apostrophe variant)'),
   #('xkb:hr::scr',           'hr',         'Croatia - Croatian'),
   #('xkb:gb:dvorak:eng',     'en-GB',      'United Kingdom - Dvorak - English'),
   #('xkb:fi::fin',           'fi',         'Finland - Finnish'),
   #('xkb:hu::hun',           'hu',         'Hungary - Hungarian'),
+
+  # TODO(hungte) There is no valid keyboard layout for it-CH yet, so we use the
+  # layout from it-IT. May update that in future.
+  #('xkb:it::ita',           'it-IT',      'Italy - Italian'),
+  #('xkb:it::ita',           'it-CH',      'Switzerland - Italian'),
+
   #('xkb:no::nob',           'no',         'Norway - Norwegian Bokmal'),
   #('xkb:pl::pol',           'pl',         'Poland - Polish'),
+  #('xkb:pt::por',           'pt-PT',      'Portugal - Portuguese'),
   #('xkb:ro::rum',           'ro',         'Romania - Romanian'),
   #('xkb:se::swe',           'sv',         'Sweden - Swedish'),
   #('xkb:sk::slo',           'sk',         'Slovakia - Slovak'),
@@ -81,14 +99,15 @@
   #('xkb:ua::ukr',           'uk',         'Ukraine - Ukrainian'),
 )
 
-assert len(kb_map) <= 10, "Currently layouts must be less than 10."
-
 class factory_SelectKeyboard(test.test):
     version = 2
 
     def write_kb(self, kb):
-        cmd = ('vpd -i RO_VPD -s "initial_locale"="%s" '
-               '-s "keyboard_layout"="%s"' % (kb[1], kb[0]))
+        cmd = ('vpd -i RO_VPD '
+               '-s "keyboard_layout"="%s" '
+               '-s "initial_locale"="%s" '
+               #'-s "initial_timezone"="$s" '
+               % kb[0:2])
         utils.system_output(cmd)
 
     def key_release_callback(self, widget, event):
@@ -103,11 +122,11 @@
             factory.log('Need a number.')
             return True
 
-        if select < 0 or select >= len(kb_map):
+        if select < 0 or select >= len(self.kb_map):
             factory.log('Invalid selection: %d' % select)
             return True
 
-        data = kb_map[select]
+        data = self.kb_map[select]
         factory.log('Selected: %s' % ', '.join(data))
         if data[0]:
             self.label.set_text('Writing keyboard layout:\n<%s: %s - %s>\n'
@@ -123,9 +142,13 @@
         window.connect('key-release-event', self.key_release_callback)
         window.add_events(gdk.KEY_RELEASE_MASK)
 
-    def run_once(self):
+    def run_once(self, kb_map=None):
 
         factory.log('%s run_once' % self.__class__)
+        if kb_map is None:
+            kb_map = DEFAULT_KBD_LAYOUT_MAP
+        assert len(kb_map) <= 10, "Currently layouts must be less than 10."
+        self.kb_map = kb_map
 
         # Message to display.
         msg = ('Choose a keyboard:\n' + "\n".join(