autotest (wifi): improve naming of some log files

The network_WiFi_OverlappingBSSScan test runs multiple
hostapd instances, and generates important information
in the hostapd logs. But the names for these log files
are hard to understand ('0' and '1').

Make the test output easier to navigate, by using
descriptive names for the hostapd logs.

Along the way:
- enhance site_linux_router, to allow for descriptive
  log file names
- plumb descriptive log file names up through HostapConfig

While there:
- also use a descriptive name for the pcap
- also use descriptive names in network_WiFi_MultiAuth
- promote a lambda to a class method

BUG=chromium:485194
TEST=network_WiFi_OverlappingBSSScan.obss (new functionality)
TEST=network_WiFi_MultiAuth (new functionality w/simultaneous APs)
TEST=network_WiFi_SimpleConnect.wifi_check11a (regression check)

Change-Id: Ia87a7e28d9d8114b909ea0f8c0f8f50e8eb82a60
Reviewed-on: https://chromium-review.googlesource.com/269776
Trybot-Ready: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: mukesh agrawal <quiche@chromium.org>
diff --git a/server/cros/network/hostap_config.py b/server/cros/network/hostap_config.py
index 57e8146..321e28d 100644
--- a/server/cros/network/hostap_config.py
+++ b/server/cros/network/hostap_config.py
@@ -435,6 +435,12 @@
         return self._beacon_footer
 
 
+    @property
+    def scenario_name(self):
+        """@return string _scenario_name value, or None."""
+        return self._scenario_name
+
+
     def __init__(self, mode=MODE_11B, channel=None, frequency=None,
                  n_capabilities=[], hide_ssid=None, beacon_interval=None,
                  dtim_period=None, frag_threshold=None, ssid=None, bssid=None,
@@ -444,7 +450,8 @@
                  vht_channel_width=None,
                  vht_center_channel=None,
                  ac_capabilities=[],
-                 beacon_footer=''):
+                 beacon_footer='',
+                 scenario_name=None):
         """Construct a HostapConfig.
 
         You may specify channel or frequency, but not both.  Both options
@@ -473,6 +480,8 @@
         @param ac_capabilities list of AC_CAPABILITY_x defined above.
         @param beacon_footer string containing (unvalidated) IE data to be
             placed at the end of the beacon.
+        @param scenario_name string to be included in file names, instead
+            of the interface name.
 
         """
         super(HostapConfig, self).__init__()
@@ -539,6 +548,7 @@
         self._vht_oper_centr_freq_seg0_idx = vht_center_channel
         self._ac_capabilities = set(ac_capabilities)
         self._beacon_footer = beacon_footer
+        self._scenario_name = scenario_name
 
 
     def __repr__(self):
diff --git a/server/site_linux_router.py b/server/site_linux_router.py
index 6e9cd3f..3626c08 100644
--- a/server/site_linux_router.py
+++ b/server/site_linux_router.py
@@ -25,7 +25,8 @@
 HostapdInstance = collections.namedtuple('HostapdInstance',
                                          ['ssid', 'conf_file', 'log_file',
                                           'interface', 'config_dict',
-                                          'stderr_log_file'])
+                                          'stderr_log_file',
+                                          'scenario_name'])
 
 # Send magic packets here, so they can wake up the system but are otherwise
 # dropped.
@@ -258,7 +259,8 @@
                 log_file,
                 interface,
                 hostapd_conf_dict.copy(),
-                stderr_log_file))
+                stderr_log_file,
+                configuration.scenario_name))
 
         # Wait for confirmation that the router came up.
         logging.info('Waiting for hostapd to startup.')
@@ -345,12 +347,16 @@
                 instance=instance.conf_file,
                 timeout_seconds=30,
                 ignore_timeouts=True)
-        files_to_copy = [(instance.log_file, 'debug/hostapd_router_%d_%s.log'  %
-                         (self._total_hostapd_instances, instance.interface)),
+        if instance.scenario_name:
+            log_identifier = instance.scenario_name
+        else:
+            log_identifier = '%d_%s' % (
+                self._total_hostapd_instances, instance.interface)
+        files_to_copy = [(instance.log_file,
+                          'debug/hostapd_router_%s.log' % log_identifier),
                          (instance.stderr_log_file,
-                          'debug/hostapd_router_%d_%s.stderr.log'  %
-                         (self._total_hostapd_instances, instance.interface))
-                        ]
+                          'debug/hostapd_router_%s.stderr.log' %
+                          log_identifier)]
         for remote_file, local_file in files_to_copy:
             if self.host.run('ls %s >/dev/null 2>&1' % remote_file,
                              ignore_status=True).exit_status:
diff --git a/server/site_tests/network_WiFi_MultiAuth/network_WiFi_MultiAuth.py b/server/site_tests/network_WiFi_MultiAuth/network_WiFi_MultiAuth.py
index 843bb1b..8de763a 100644
--- a/server/site_tests/network_WiFi_MultiAuth/network_WiFi_MultiAuth.py
+++ b/server/site_tests/network_WiFi_MultiAuth/network_WiFi_MultiAuth.py
@@ -29,14 +29,16 @@
         ap_config0 = hostap_config.HostapConfig(
                 ssid=self.TEST_SSID,
                 frequency=2412,
-                mode=hostap_config.HostapConfig.MODE_11G)
+                mode=hostap_config.HostapConfig.MODE_11G,
+                scenario_name='open_network')
         client_config0 = xmlrpc_datatypes.AssociationParameters(
                 ssid=self.TEST_SSID)
         ap_config1 = hostap_config.HostapConfig(
                 ssid=self.TEST_SSID,
                 frequency=5240,
                 mode=hostap_config.HostapConfig.MODE_11A,
-                security_config=wpa_config)
+                security_config=wpa_config,
+                scenario_name='wpa_network')
         client_config1 = xmlrpc_datatypes.AssociationParameters(
                 ssid=self.TEST_SSID,
                 security_config=wpa_config)
diff --git a/server/site_tests/network_WiFi_OverlappingBSSScan/network_WiFi_OverlappingBSSScan.py b/server/site_tests/network_WiFi_OverlappingBSSScan/network_WiFi_OverlappingBSSScan.py
index d66a98b..d0c512e 100644
--- a/server/site_tests/network_WiFi_OverlappingBSSScan/network_WiFi_OverlappingBSSScan.py
+++ b/server/site_tests/network_WiFi_OverlappingBSSScan/network_WiFi_OverlappingBSSScan.py
@@ -23,15 +23,29 @@
     WIFI_FREQUENCY = 2437
 
 
+    @classmethod
+    def get_ap_config(cls, scenario_name, use_obss):
+        """Returns a HostapConfig object based on the given parameters.
+
+        @param scenario_name: string describing a portion of this test.
+        @param use_obss: bool indicating if the AP should ask clients to
+            perform OBSS scans.
+        @return HostapConfig which incorporates the given parameters.
+
+        """
+        return hostap_config.HostapConfig(
+            frequency=cls.WIFI_FREQUENCY,
+            mode=hostap_config.HostapConfig.MODE_11N_PURE,
+            n_capabilities=[
+                hostap_config.HostapConfig.N_CAPABILITY_GREENFIELD,
+                hostap_config.HostapConfig.N_CAPABILITY_HT40
+            ],
+            obss_interval=10 if use_obss else None,
+            scenario_name=scenario_name)
+
+
     def run_once(self):
         """Body of the test."""
-        caps = [hostap_config.HostapConfig.N_CAPABILITY_GREENFIELD,
-                hostap_config.HostapConfig.N_CAPABILITY_HT40]
-        get_ap_config = lambda use_obss: hostap_config.HostapConfig(
-                frequency=self.WIFI_FREQUENCY,
-                mode=hostap_config.HostapConfig.MODE_11N_PURE,
-                n_capabilities=caps,
-                obss_interval=10 if use_obss else None)
         get_assoc_params = lambda: xmlrpc_datatypes.AssociationParameters(
                 ssid=self.context.router.get_ssid())
         get_ping_config = lambda period: ping_runner.PingConfig(
@@ -39,7 +53,7 @@
                 interval=self.PING_INTERVAL_SECONDS,
                 count=int(period / self.PING_INTERVAL_SECONDS))
         # Gather some statistics about ping latencies without scanning going on.
-        self.context.configure(get_ap_config(False))
+        self.context.configure(self.get_ap_config('obss_disabled', False))
         self.context.assert_connect_wifi(get_assoc_params())
         logging.info('Pinging router without OBSS scans for %d seconds.',
                      self.NO_OBSS_SCAN_SAMPLE_PERIOD_SECONDS)
@@ -55,8 +69,9 @@
         self.context.client.shill.disconnect(self.context.router.get_ssid())
 
         # Re-configure the AP for OBSS and repeat the ping test.
-        self.context.configure(get_ap_config(True))
-        self.context.router.start_capture(self.WIFI_FREQUENCY)
+        self.context.configure(self.get_ap_config('obss_enabled', True))
+        self.context.router.start_capture(
+          self.WIFI_FREQUENCY, filename='obss_enabled.pcap')
 
         self.context.assert_connect_wifi(get_assoc_params())
         logging.info('Pinging router with OBSS scans for %d seconds.',