Merge "Refactoring parse_parameters methods"
diff --git a/acts/framework/acts/test_utils/power/PowerCellularLabBaseTest.py b/acts/framework/acts/test_utils/power/PowerCellularLabBaseTest.py
index 676dafb..e3495aa 100644
--- a/acts/framework/acts/test_utils/power/PowerCellularLabBaseTest.py
+++ b/acts/framework/acts/test_utils/power/PowerCellularLabBaseTest.py
@@ -150,8 +150,12 @@
self.simulation.detach()
# Parse simulation parameters.
- # This may return false if incorrect values are passed.
- if not self.simulation.parse_parameters(self.parameters):
+ # This may throw a ValueError exception if incorrect values are passed
+ # or if required arguments are omitted.
+ try:
+ self.simulation.parse_parameters(self.parameters)
+ except ValueError as error:
+ self.log.error(str(error))
return False
# Wait for new params to settle
@@ -161,8 +165,7 @@
if not self.simulation.attach():
return False
- if not self.simulation.start_test_case():
- return False
+ self.simulation.start_test_case()
# Make the device go to sleep
self.dut.droid.goToSleepNow()
diff --git a/acts/framework/acts/test_utils/power/tel_simulations/BaseSimulation.py b/acts/framework/acts/test_utils/power/tel_simulations/BaseSimulation.py
index f30c8a4..bb191a7 100644
--- a/acts/framework/acts/test_utils/power/tel_simulations/BaseSimulation.py
+++ b/acts/framework/acts/test_utils/power/tel_simulations/BaseSimulation.py
@@ -237,11 +237,9 @@
Args:
parameters: list of parameters
- Returns:
- False if there was an error while parsing parameters
"""
- return True
+ pass
def consume_parameter(self, parameters, parameter_name, num_values=0):
""" Parses a parameter from a list.
@@ -271,10 +269,9 @@
for j in range(num_values + 1):
return_list.append(parameters.pop(i))
except IndexError:
- self.log.error(
+ raise ValueError(
"Parameter {} has to be followed by {} values.".format(
parameter_name, num_values))
- raise ValueError()
return return_list
@@ -657,10 +654,6 @@
""" Starts a test case in the current simulation.
Requires the phone to be attached.
-
- Returns:
- True if the case was successfully started.
-
"""
- return True
+ pass
diff --git a/acts/framework/acts/test_utils/power/tel_simulations/GsmSimulation.py b/acts/framework/acts/test_utils/power/tel_simulations/GsmSimulation.py
index 67fb981..16bfa8a 100644
--- a/acts/framework/acts/test_utils/power/tel_simulations/GsmSimulation.py
+++ b/acts/framework/acts/test_utils/power/tel_simulations/GsmSimulation.py
@@ -87,22 +87,18 @@
Args:
parameters: list of parameters
- Returns:
- False if there was an error while parsing the config
"""
- if not super().parse_parameters(parameters):
- return False
+ super().parse_parameters(parameters)
# Setup band
values = self.consume_parameter(parameters, self.PARAM_BAND, 1)
if not values:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter '{}' followed by "
"the required band number.".format(self.PARAM_BAND))
- return False
self.set_band(self.bts1, values[1])
@@ -115,24 +111,19 @@
elif self.consume_parameter(parameters, self.PARAM_NO_GPRS):
self.bts1.gsm_gprs_mode = BtsGprsMode.NO_GPRS
else:
- self.log.error(
+ raise ValueError(
"GPRS mode needs to be indicated in the test name with either "
"{}, {} or {}.".format(self.PARAM_GPRS, self.PARAM_EGPRS,
self.PARAM_NO_GPRS))
- return False
# Setup slot allocation
values = self.consume_parameter(parameters, self.PARAM_SLOTS, 2)
if not values:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter {} followed by two "
"int values indicating DL and UL slots.".format(
self.PARAM_SLOTS))
- return False
self.bts1.gsm_slots = (int(values[1]), int(values[2]))
-
- # No errors were found
- return True
diff --git a/acts/framework/acts/test_utils/power/tel_simulations/LteCaSimulation.py b/acts/framework/acts/test_utils/power/tel_simulations/LteCaSimulation.py
index 0032eb4..f401465 100644
--- a/acts/framework/acts/test_utils/power/tel_simulations/LteCaSimulation.py
+++ b/acts/framework/acts/test_utils/power/tel_simulations/LteCaSimulation.py
@@ -68,23 +68,19 @@
Args:
parameters: list of parameters
- Returns:
- False if there was an error while parsing the config
"""
- if not super(LteSimulation, self).parse_parameters(parameters):
- return False
+ super(LteSimulation, self).parse_parameters(parameters)
# Get the CA band configuration
values = self.consume_parameter(parameters, self.PARAM_CA, 1)
if not values:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter '{}' followed by "
"the CA configuration. For example: ca_3c7c28a".format(
self.PARAM_CA))
- return False
# Carrier aggregation configurations are indicated with the band numbers
# followed by the CA classes in a single string. For example, for 5 CA
@@ -92,10 +88,9 @@
ca_configs = re.findall(r'(\d+[abcABC])', values[1])
if not ca_configs:
- self.log.error(
+ raise ValueError(
"The CA configuration has to be indicated with one string as "
"in the following example: ca_3c7c28a".format(self.PARAM_CA))
- return False
carriers = []
bts_index = 0
@@ -109,20 +104,19 @@
ca_class = ca[-1]
if ca_class.upper() == 'B':
- self.log.error("Class B carrier aggregation is not supported.")
- return False
+ raise ValueError(
+ "Class B carrier aggregation is not supported.")
if band in carriers:
- self.log.error("Intra-band non contiguous carrier aggregation "
- "is not supported.")
- return False
+ raise ValueError(
+ "Intra-band non contiguous carrier aggregation "
+ "is not supported.")
if ca_class.upper() == 'A':
if bts_index >= len(self.bts):
- self.log.error("This callbox model doesn't allow the "
- "requested CA configuration")
- return False
+ raise ValueError("This callbox model doesn't allow the "
+ "requested CA configuration")
self.set_band_with_defaults(
self.bts[bts_index],
@@ -134,9 +128,8 @@
elif ca_class.upper() == 'C':
if bts_index + 1 >= len(self.bts):
- self.log.error("This callbox model doesn't allow the "
- "requested CA configuration")
- return False
+ raise ValueError("This callbox model doesn't allow the "
+ "requested CA configuration")
self.set_band_with_defaults(
self.bts[bts_index],
@@ -150,18 +143,16 @@
bts_index += 2
else:
- self.log.error("Invalid carrier aggregation configuration: "
- "{}{}.".format(band, ca_class))
- return False
+ raise ValueError("Invalid carrier aggregation configuration: "
+ "{}{}.".format(band, ca_class))
carriers.append(band)
# Ensure there are at least two carriers being used
self.num_carriers = bts_index
if self.num_carriers < 2:
- self.log.error("At least two carriers need to be indicated for the"
- " carrier aggregation sim.")
- return False
+ raise ValueError("At least two carriers need to be indicated for "
+ "the carrier aggregation sim.")
# Get the bw for each carrier
# This is an optional parameter, by default the maximum bandwidth for
@@ -214,17 +205,16 @@
self.num_carriers)
if not mimo_values:
- self.log.error("The test parameter '{}' has to be included in the "
- "test name followed by the MIMO mode for each "
- "carrier separated by underscores.".format(
- self.PARAM_MIMO))
- return False
+ raise ValueError(
+ "The test parameter '{}' has to be included in the "
+ "test name followed by the MIMO mode for each "
+ "carrier separated by underscores.".format(self.PARAM_MIMO))
if len(mimo_values) != self.num_carriers + 1:
- self.log.error("The test parameter '{}' has to be followed by "
- "a number of MIMO mode values equal to the number "
- "of carriers being used.".format(self.PARAM_MIMO))
- return False
+ raise ValueError(
+ "The test parameter '{}' has to be followed by "
+ "a number of MIMO mode values equal to the number "
+ "of carriers being used.".format(self.PARAM_MIMO))
for bts_index in range(self.num_carriers):
@@ -235,16 +225,15 @@
requested_mimo = mimo_mode
break
else:
- self.log.error("The mimo mode must be one of %s." %
- {elem.value
- for elem in LteSimulation.MimoMode})
- return False
+ raise ValueError(
+ "The mimo mode must be one of %s." %
+ {elem.value
+ for elem in LteSimulation.MimoMode})
if (requested_mimo == LteSimulation.MimoMode.MIMO_4x4
and self.anritsu._md8475_version == 'A'):
- self.log.error("The test requires 4x4 MIMO, but that is not "
- "supported by the MD8475A callbox.")
- return False
+ raise ValueError("The test requires 4x4 MIMO, but that is not "
+ "supported by the MD8475A callbox.")
self.set_mimo_mode(self.bts[bts_index], requested_mimo)
@@ -256,11 +245,10 @@
requested_tm = tm
break
else:
- self.log.error(
+ raise ValueError(
"The TM must be one of %s." %
{elem.value
for elem in LteSimulation.MimoMode})
- return False
else:
# Provide default values if the TM parameter is not set
if requested_mimo == LteSimulation.MimoMode.MIMO_1x1:
@@ -277,9 +265,6 @@
ul_power = self.get_uplink_power_from_parameters(parameters)
- if not ul_power:
- return False
-
# Power is not set on the callbox until after the simulation is
# started. Saving this value in a variable for later
self.sim_ul_power = ul_power
@@ -288,9 +273,6 @@
dl_power = self.get_downlink_power_from_parameters(parameters)
- if not dl_power:
- return False
-
# Power is not set on the callbox until after the simulation is
# started. Saving this value in a variable for later
self.sim_dl_power = dl_power
@@ -311,13 +293,12 @@
scheduling = scheduling_mode
break
else:
- self.log.error(
+ raise ValueError(
"The test name parameter '{}' has to be followed by one of "
"{}.".format(
self.PARAM_SCHEDULING,
{elem.value
for elem in LteSimulation.SchedulingMode}))
- return False
if scheduling == LteSimulation.SchedulingMode.STATIC:
@@ -338,11 +319,10 @@
if (dl_pattern, ul_pattern) not in [(0, 100), (100, 0), (100,
100)]:
- self.log.error(
+ raise ValueError(
"Only full RB allocation for DL or UL is supported in CA "
"sims. The allowed combinations are 100/0, 0/100 and "
"100/100.")
- return False
if self.dl_256_qam and bw == 1.4:
mcs_dl = 26
@@ -377,9 +357,6 @@
self.set_scheduling_mode(self.bts[bts_index],
LteSimulation.SchedulingMode.DYNAMIC)
- # No errors were found
- return True
-
def set_band_with_defaults(self, bts, band, calibrate_if_necessary=True):
""" Switches to the given band restoring default values
@@ -442,12 +419,12 @@
while self.anritsu.get_testcase_status() == "0":
retry_counter += 1
if retry_counter == 3:
- self.log.error("The test case failed to start.")
- return False
+ raise RuntimeError("The test case failed to start after {} "
+ "retries. The connection between the phone "
+ "and the basestation might be unstable."
+ .format(retry_counter))
time.sleep(10)
- return True
-
def maximum_downlink_throughput(self):
""" Calculates maximum downlink throughput as the sum of all the active
carriers.
diff --git a/acts/framework/acts/test_utils/power/tel_simulations/LteSimulation.py b/acts/framework/acts/test_utils/power/tel_simulations/LteSimulation.py
index bf3040e..73a5cd0 100644
--- a/acts/framework/acts/test_utils/power/tel_simulations/LteSimulation.py
+++ b/acts/framework/acts/test_utils/power/tel_simulations/LteSimulation.py
@@ -301,22 +301,18 @@
Args:
parameters: list of parameters
- Returns:
- False if there was an error while parsing the config
"""
- if not super().parse_parameters(parameters):
- return False
+ super().parse_parameters(parameters)
# Setup band
values = self.consume_parameter(parameters, self.PARAM_BAND, 1)
if not values:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter '{}' followed by "
"the required band number.".format(self.PARAM_BAND))
- return False
band = values[1]
@@ -324,16 +320,16 @@
# Set DL/UL frame configuration
if self.get_duplex_mode(band) == self.DuplexMode.TDD:
- try:
- values = self.consume_parameter(parameters,
- self.PARAM_FRAME_CONFIG, 1)
- frame_config = int(values[1])
- except:
- self.log.error("When a TDD band is selected the frame "
- "structure has to be indicated with the '{}' "
- "parameter followed by a number from 0 to 6."
- .format(self.PARAM_FRAME_CONFIG))
- return False
+
+ values = self.consume_parameter(parameters,
+ self.PARAM_FRAME_CONFIG, 1)
+ if not values:
+ raise ValueError("When a TDD band is selected the frame "
+ "structure has to be indicated with the '{}' "
+ "parameter followed by a number from 0 to 6."
+ .format(self.PARAM_FRAME_CONFIG))
+
+ frame_config = int(values[1])
self.set_dlul_configuration(self.bts1, frame_config)
@@ -342,10 +338,10 @@
values = self.consume_parameter(parameters, self.PARAM_BW, 1)
if not values:
- self.log.error(
- "The test name needs to include parameter {} followed by an int"
- " value (to indicate 1.4 MHz use 14).".format(self.PARAM_BW))
- return False
+ raise ValueError(
+ "The test name needs to include parameter {} followed by an "
+ "int value (to indicate 1.4 MHz use 14).".format(
+ self.PARAM_BW))
bw = float(values[1])
@@ -359,25 +355,22 @@
values = self.consume_parameter(parameters, self.PARAM_MIMO, 1)
if not values:
- self.log.error(
- "The test name needs to include parameter '{}' followed by the"
- " mimo mode.".format(self.PARAM_MIMO))
- return False
+ raise ValueError(
+ "The test name needs to include parameter '{}' followed by the "
+ "mimo mode.".format(self.PARAM_MIMO))
for mimo_mode in LteSimulation.MimoMode:
if values[1] == mimo_mode.value:
self.set_mimo_mode(self.bts1, mimo_mode)
break
else:
- self.log.error("The {} parameter needs to be followed by either "
- "1x1, 2x2 or 4x4.".format(self.PARAM_MIMO))
- return False
+ raise ValueError("The {} parameter needs to be followed by either "
+ "1x1, 2x2 or 4x4.".format(self.PARAM_MIMO))
if (mimo_mode == LteSimulation.MimoMode.MIMO_4x4
and self.anritsu._md8475_version == 'A'):
- self.log.error("The test requires 4x4 MIMO, but that is not "
- "supported by the MD8475A callbox.")
- return False
+ raise ValueError("The test requires 4x4 MIMO, but that is not "
+ "supported by the MD8475A callbox.")
self.set_mimo_mode(self.bts1, mimo_mode)
@@ -386,21 +379,19 @@
values = self.consume_parameter(parameters, self.PARAM_TM, 1)
if not values:
- self.log.error(
- "The test name needs to include parameter {} followed by an int"
- " value from 1 to 4 indicating transmission mode.".format(
+ raise ValueError(
+ "The test name needs to include parameter {} followed by an "
+ "int value from 1 to 4 indicating transmission mode.".format(
self.PARAM_TM))
- return False
for tm in LteSimulation.TransmissionMode:
if values[1] == tm.value[2:]:
self.set_transmission_mode(self.bts1, tm)
break
else:
- self.log.error("The {} parameter needs to be followed by either "
- "TM1, TM2, TM3, TM4, TM7, TM8 or TM9.".format(
- self.PARAM_MIMO))
- return False
+ raise ValueError("The {} parameter needs to be followed by either "
+ "TM1, TM2, TM3, TM4, TM7, TM8 or TM9.".format(
+ self.PARAM_MIMO))
# Setup scheduling mode
@@ -416,10 +407,9 @@
elif values[1] == self.PARAM_SCHEDULING_STATIC:
scheduling = LteSimulation.SchedulingMode.STATIC
else:
- self.log.error(
+ raise ValueError(
"The test name parameter '{}' has to be followed by either "
"'dynamic' or 'static'.".format(self.PARAM_SCHEDULING))
- return False
if scheduling == LteSimulation.SchedulingMode.STATIC:
@@ -439,10 +429,9 @@
ul_pattern = int(values[2])
if not (0 <= dl_pattern <= 100 and 0 <= ul_pattern <= 100):
- self.log.error(
+ raise ValueError(
"The scheduling pattern parameters need to be two "
"positive numbers between 0 and 100.")
- return False
dl_rbs, ul_rbs = self.allocation_percentages_to_rbs(
self.bts1, dl_pattern, ul_pattern)
@@ -477,9 +466,6 @@
ul_power = self.get_uplink_power_from_parameters(parameters)
- if not ul_power:
- return False
-
# Power is not set on the callbox until after the simulation is
# started. Saving this value in a variable for later
self.sim_ul_power = ul_power
@@ -488,29 +474,21 @@
dl_power = self.get_downlink_power_from_parameters(parameters)
- if not dl_power:
- return False
-
# Power is not set on the callbox until after the simulation is
# started. Saving this value in a variable for later
self.sim_dl_power = dl_power
- # No errors were found
- return True
-
def get_uplink_power_from_parameters(self, parameters):
""" Reads uplink power from a list of parameters. """
values = self.consume_parameter(parameters, self.PARAM_UL_PW, 1)
if not values or values[1] not in self.uplink_signal_level_dictionary:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter {} followed by one "
"the following values: {}.".format(self.PARAM_UL_PW, [
- "\n" + val
- for val in self.uplink_signal_level_dictionary.keys()
+ val for val in self.uplink_signal_level_dictionary.keys()
]))
- return None
return self.uplink_signal_level_dictionary[values[1]]
@@ -521,17 +499,16 @@
if values:
if values[1] not in self.downlink_rsrp_dictionary:
- self.log.error("Invalid signal level value {}.".format(
+ raise ValueError("Invalid signal level value {}.".format(
values[1]))
- return None
else:
return self.downlink_rsrp_dictionary[values[1]]
else:
# Use default value
power = self.downlink_rsrp_dictionary['excellent']
- self.log.error(
- "No DL signal level value was indicated in the test parameters."
- " Using default value of {} RSRP.".format(power))
+ self.log.info(
+ "No DL signal level value was indicated in the test "
+ "parameters. Using default value of {} RSRP.".format(power))
return power
def set_downlink_rx_power(self, bts, rsrp):
diff --git a/acts/framework/acts/test_utils/power/tel_simulations/UmtsSimulation.py b/acts/framework/acts/test_utils/power/tel_simulations/UmtsSimulation.py
index a2cb7ac..aa89d01 100644
--- a/acts/framework/acts/test_utils/power/tel_simulations/UmtsSimulation.py
+++ b/acts/framework/acts/test_utils/power/tel_simulations/UmtsSimulation.py
@@ -107,22 +107,18 @@
Args:
parameters: list of parameters
- Returns:
- False if there was an error while parsing the config
"""
- if not super().parse_parameters(parameters):
- return False
+ super().parse_parameters(parameters)
# Setup band
values = self.consume_parameter(parameters, self.PARAM_BAND, 1)
if not values:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter '{}' followed by "
"the required band number.".format(self.PARAM_BAND))
- return False
self.set_band(self.bts1, values[1])
@@ -135,10 +131,9 @@
self.PARAM_RELEASE_VERSION_7, self.PARAM_RELEASE_VERSION_8,
self.PARAM_RELEASE_VERSION_99
]:
- self.log.error(
+ raise ValueError(
"The test name needs to include the parameter {} followed by a "
"valid release version.".format(self.PARAM_RELEASE_VERSION))
- return False
self.set_release_version(self.bts1, values[1])
@@ -146,13 +141,12 @@
values = self.consume_parameter(parameters, self.PARAM_UL_PW, 1)
if not values or values[1] not in self.uplink_signal_level_dictionary:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter {} followed by "
"one the following values: {}.".format(self.PARAM_UL_PW, [
"\n" + val
for val in self.uplink_signal_level_dictionary.keys()
]))
- return False
# Power is not set on the callbox until after the simulation is
# started. Will save this value in a variable and use it later
@@ -163,22 +157,16 @@
values = self.consume_parameter(parameters, self.PARAM_DL_PW, 1)
if not values or values[1] not in self.downlink_rscp_dictionary:
- self.log.error(
+ raise ValueError(
"The test name needs to include parameter {} followed by "
"one of the following values: {}.".format(
- self.PARAM_DL_PW, [
- "\n" + val
- for val in self.downlink_rscp_dictionary.keys()
- ]))
- return False
+ self.PARAM_DL_PW,
+ [val for val in self.downlink_rscp_dictionary.keys()]))
# Power is not set on the callbox until after the simulation is
# started. Will save this value in a variable and use it later
self.sim_dl_power = self.downlink_rscp_dictionary[values[1]]
- # No errors were found
- return True
-
def set_release_version(self, bts, release_version):
""" Sets the release version.