<matrixBuild _class='hudson.matrix.MatrixBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>950086</buildingDurationMillis><executingTimeMillis>950086</executingTimeMillis><executorUtilization>1.0</executorUtilization><queuingDurationMillis>9146</queuingDurationMillis><queuingTimeMillis>9146</queuingTimeMillis><subTaskCount>0</subTaskCount><totalDurationMillis>959232</totalDurationMillis><waitingDurationMillis>9078</waitingDurationMillis><waitingTimeMillis>9078</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierfixgr _class='hudson.plugins.git.util.Build'><buildNumber>2045</buildNumber><marked><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></marked><revision><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></revision></refsremotesoriginpmaierfixgr><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster><refsremotesoriginpmaierara-m _class='hudson.plugins.git.util.Build'><buildNumber>1320</buildNumber><marked><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></marked><revision><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></revision></refsremotesoriginpmaierara-m><refsremotesoriginpmaierkeepfiles _class='hudson.plugins.git.util.Build'><buildNumber>1353</buildNumber><marked><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></marked><revision><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></revision></refsremotesoriginpmaierkeepfiles><refsremotesoriginpmaierfixapdu _class='hudson.plugins.git.util.Build'><buildNumber>1421</buildNumber><marked><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></marked><revision><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></revision></refsremotesoriginpmaierfixapdu><refsremotesoriginpmaieraramtest _class='hudson.plugins.git.util.Build'><buildNumber>1467</buildNumber><marked><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></marked><revision><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></revision></refsremotesoriginpmaieraramtest><refsremotesoriginosmithwip _class='hudson.plugins.git.util.Build'><buildNumber>1816</buildNumber><marked><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></marked><revision><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></revision></refsremotesoriginosmithwip><refsremotesoriginpmaierotatest _class='hudson.plugins.git.util.Build'><buildNumber>2022</buildNumber><marked><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></marked><revision><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></revision></refsremotesoriginpmaierotatest><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>402</buildNumber><marked><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/2189/artifact</artifactsUrl><changesUrl>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/changes</changesUrl><displayUrl>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/2189/</displayUrl><testsUrl>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/2189/testReport</testsUrl></action><building>false</building><displayName>#2189</displayName><duration>950086</duration><estimatedDuration>937180</estimatedDuration><fullDisplayName>master-pysim #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149472</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/2189/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><description></description><fullName>Vadim Yanitskiy</fullName><id>fixeria</id></culprit><run><action _class='hudson.matrix.MatrixChildParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UpstreamCause'><shortDescription>Started by upstream project "master-pysim" build number 2,189</shortDescription><upstreamBuild>2189</upstreamBuild><upstreamProject>master-pysim</upstreamProject><upstreamUrl>job/master-pysim/</upstreamUrl></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>1</buildableDurationMillis><buildableTimeMillis>1</buildableTimeMillis><buildingDurationMillis>945562</buildingDurationMillis><executingTimeMillis>945562</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>0</waitingDurationMillis><waitingTimeMillis>0</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2189</displayName><duration>945562</duration><estimatedDuration>935591</estimatedDuration><fullDisplayName>master-pysim » card-test,a1=default,a3=default,a4=default,simtester #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149475</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/JOB_TYPE=card-test,a1=default,a3=default,a4=default,label=simtester/2189/</url><builtOn>simtester</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></culprit></run><run><action _class='hudson.matrix.MatrixChildParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UpstreamCause'><shortDescription>Started by upstream project "master-pysim" build number 2,189</shortDescription><upstreamBuild>2189</upstreamBuild><upstreamProject>master-pysim</upstreamProject><upstreamUrl>job/master-pysim/</upstreamUrl></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>12186</buildingDurationMillis><executingTimeMillis>12186</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>0</waitingDurationMillis><waitingTimeMillis>0</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2189</displayName><duration>12186</duration><estimatedDuration>9937</estimatedDuration><fullDisplayName>master-pysim » distcheck,a1=default,a3=default,a4=default,osmocom-master #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149474</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/JOB_TYPE=distcheck,a1=default,a3=default,a4=default,label=osmocom-master/2189/</url><builtOn>build4-deb12build-ansible</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></culprit></run><run><action _class='hudson.matrix.MatrixChildParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UpstreamCause'><shortDescription>Started by upstream project "master-pysim" build number 2,189</shortDescription><upstreamBuild>2189</upstreamBuild><upstreamProject>master-pysim</upstreamProject><upstreamUrl>job/master-pysim/</upstreamUrl></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>3</buildableDurationMillis><buildableTimeMillis>3</buildableTimeMillis><buildingDurationMillis>26433</buildingDurationMillis><executingTimeMillis>26433</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>0</waitingDurationMillis><waitingTimeMillis>0</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierfixgr _class='hudson.plugins.git.util.Build'><buildNumber>2045</buildNumber><marked><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></marked><revision><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></revision></refsremotesoriginpmaierfixgr><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster><refsremotesoriginpmaierara-m _class='hudson.plugins.git.util.Build'><buildNumber>1320</buildNumber><marked><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></marked><revision><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></revision></refsremotesoriginpmaierara-m><refsremotesoriginpmaierkeepfiles _class='hudson.plugins.git.util.Build'><buildNumber>1353</buildNumber><marked><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></marked><revision><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></revision></refsremotesoriginpmaierkeepfiles><refsremotesoriginpmaierfixapdu _class='hudson.plugins.git.util.Build'><buildNumber>1421</buildNumber><marked><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></marked><revision><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></revision></refsremotesoriginpmaierfixapdu><refsremotesoriginpmaieraramtest _class='hudson.plugins.git.util.Build'><buildNumber>1467</buildNumber><marked><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></marked><revision><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></revision></refsremotesoriginpmaieraramtest><refsremotesoriginosmithwip _class='hudson.plugins.git.util.Build'><buildNumber>1816</buildNumber><marked><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></marked><revision><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></revision></refsremotesoriginosmithwip><refsremotesoriginpmaierotatest _class='hudson.plugins.git.util.Build'><buildNumber>2022</buildNumber><marked><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></marked><revision><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></revision></refsremotesoriginpmaierotatest><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>402</buildNumber><marked><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2189</displayName><duration>26433</duration><estimatedDuration>26712</estimatedDuration><fullDisplayName>master-pysim » docs,a1=default,a3=default,a4=default,osmocom-master #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149476</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/JOB_TYPE=docs,a1=default,a3=default,a4=default,label=osmocom-master/2189/</url><builtOn>build5-deb12build-ansible</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></culprit></run><run><action _class='hudson.matrix.MatrixChildParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UpstreamCause'><shortDescription>Started by upstream project "master-pysim" build number 2,189</shortDescription><upstreamBuild>2189</upstreamBuild><upstreamProject>master-pysim</upstreamProject><upstreamUrl>job/master-pysim/</upstreamUrl></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>3</buildableDurationMillis><buildableTimeMillis>3</buildableTimeMillis><buildingDurationMillis>13964</buildingDurationMillis><executingTimeMillis>13964</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>66</waitingDurationMillis><waitingTimeMillis>66</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierfixgr _class='hudson.plugins.git.util.Build'><buildNumber>2045</buildNumber><marked><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></marked><revision><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></revision></refsremotesoriginpmaierfixgr><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster><refsremotesoriginpmaierara-m _class='hudson.plugins.git.util.Build'><buildNumber>1320</buildNumber><marked><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></marked><revision><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></revision></refsremotesoriginpmaierara-m><refsremotesoriginpmaierkeepfiles _class='hudson.plugins.git.util.Build'><buildNumber>1353</buildNumber><marked><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></marked><revision><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></revision></refsremotesoriginpmaierkeepfiles><refsremotesoriginpmaierfixapdu _class='hudson.plugins.git.util.Build'><buildNumber>1421</buildNumber><marked><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></marked><revision><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></revision></refsremotesoriginpmaierfixapdu><refsremotesoriginpmaieraramtest _class='hudson.plugins.git.util.Build'><buildNumber>1467</buildNumber><marked><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></marked><revision><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></revision></refsremotesoriginpmaieraramtest><refsremotesoriginosmithwip _class='hudson.plugins.git.util.Build'><buildNumber>1816</buildNumber><marked><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></marked><revision><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></revision></refsremotesoriginosmithwip><refsremotesoriginpmaierotatest _class='hudson.plugins.git.util.Build'><buildNumber>2022</buildNumber><marked><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></marked><revision><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></revision></refsremotesoriginpmaierotatest><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>402</buildNumber><marked><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2189</displayName><duration>13964</duration><estimatedDuration>11686</estimatedDuration><fullDisplayName>master-pysim » pylint,a1=default,a3=default,a4=default,osmocom-master #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149477</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/JOB_TYPE=pylint,a1=default,a3=default,a4=default,label=osmocom-master/2189/</url><builtOn>build4-deb12build-ansible</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></culprit></run><run><action _class='hudson.matrix.MatrixChildParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org laforge@gnumonks.org</value></parameter></action><action></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UpstreamCause'><shortDescription>Started by upstream project "master-pysim" build number 2,189</shortDescription><upstreamBuild>2189</upstreamBuild><upstreamProject>master-pysim</upstreamProject><upstreamUrl>job/master-pysim/</upstreamUrl></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>2</buildableDurationMillis><buildableTimeMillis>2</buildableTimeMillis><buildingDurationMillis>12764</buildingDurationMillis><executingTimeMillis>12764</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>0</waitingDurationMillis><waitingTimeMillis>0</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2131</buildNumber><marked><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><branch><SHA1>ba01cb7afffa0141e4e9476d566366801773c416</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2189</buildNumber><marked><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></marked><revision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></revision></originmaster></buildsByBranchName><lastBuiltRevision><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><branch><SHA1>b5ba274583cf9988fe266aa5a75f575df8751135</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2189</displayName><duration>12764</duration><estimatedDuration>27690</estimatedDuration><fullDisplayName>master-pysim » test,a1=default,a3=default,a4=default,osmocom-master #2189</fullDisplayName><id>2189</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2189</number><queueId>149478</queueId><result>SUCCESS</result><timestamp>1782115509521</timestamp><url>https://jenkins.osmocom.org/jenkins/view/no-generated/job/master-pysim/JOB_TYPE=test,a1=default,a3=default,a4=default,label=osmocom-master/2189/</url><builtOn>build5-deb12build-ansible</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</commitId><timestamp>1781987378000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>ConfigurableParameter: do not magically overwrite the 'name' attribute

The ClassVarMeta metaclass used to derive each ConfigurableParameter's
'name' attribute automatically from the Python class name (via
camel_to_snake()).  Stop doing this, for three reasons:

1) Python class names follow constraints that do not fit the naming
   commonly used in CSV files.  For example, a name like
   "5GS-SUCI-CalcInfo" starts with a digit and contains dashes,
   neither of which is permissible in a class name.

2) Python class names live in their own namespace, distinct from the
   one used to present eSIM parameters to end users.  Deriving the UI
   name from the class name couples these two namespaces together.

   Taken together, (1) and (2) mean that automatic naming both imposes
   class-name constraints on the user-visible names and merges the
   internal Python namespace with the publicly shown one - a layer
   violation from the perspective of UI design.

3) Overriding 'name' from __new__() makes manual naming impossible: a
   subclass that sets 'name = "bar"' as a class attribute would still
   end up with the value computed by the metaclass, which is
   surprising and hard to track down:

       class MySuper(metaclass=...):  # __new__ sets name = 'foo'
           ...
       class MySub(MySuper):
           name = 'bar'
       print(MySub().name)  # 'foo', not 'bar' as one would expect

Change-Id: I6f631444c6addeb7ccc5f6c55b9be3dc83409169
Jenkins: skip-card-test
</comment><date>2026-06-21 03:29:38 +0700</date><id>a7c762eb2e2d7b617f99f2637a1e07d6fcb21c99</id><msg>ConfigurableParameter: do not magically overwrite the 'name' attribute</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>tests/unittests/smdpp_data</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>3974e9693301d23104bae4a995cb22639ac5e0c2</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_configurable_parameters.py

Add ConfigurableParameterTest, which applies each parameter to a real
UPP DER template and reads it back, comparing results against a stored
expected-output snapshot (xo/test_configurable_parameters).

Add TestValidateVal covering validate_val() for Iccid, Imsi, Pin1, Puk1
and K, testing both valid inputs and invalid ones expected to raise
ValueError.

Add TestEnumParam covering the EnumParam methods (validate_val,
map_name_to_val, map_val_to_name, name_normalize, clean_name_str) using
AlgorithmID as the concrete subclass, including fuzzy name matching.

Also add get_value_from_pes() to ConfigurableParameter as a convenience
wrapper around get_values_from_pes() that asserts all returned values
are identical and returns the single result.

Change-Id: Ia55f0d11f8197ca15a948a83a34b3488acf1a0b4
Co-authored-by: Vadim Yanitskiy &lt;vyanitskiy@sysmocom.de&gt;
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>3974e9693301d23104bae4a995cb22639ac5e0c2</id><msg>add test_configurable_parameters.py</msg><path><editType>add</editType><file>tests/unittests/smdpp_data</file></path><path><editType>add</editType><file>tests/unittests/test_configurable_parameters.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization.ConfigurableParameter: fix BytesIO() input

Change-Id: I0ad160eef9015e76eef10baee7c6b606fe249123
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>ef0a2fcb375d3715d68d6f7f61e70c65e4dc4891</id><msg>personalization.ConfigurableParameter: fix BytesIO() input</msg><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_configurable_parameters.py</affectedPath><affectedPath>tests/unittests/xo/test_configurable_parameters</affectedPath><affectedPath>pySim/esim/saip/personalization.py</affectedPath><commitId>bfdfcad22cb124bdd97e132396bb72ec1b20c412</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>personalization: add int as input type for BinaryParameter

Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>bfdfcad22cb124bdd97e132396bb72ec1b20c412</id><msg>personalization: add int as input type for BinaryParameter</msg><path><editType>edit</editType><file>tests/unittests/xo/test_configurable_parameters</file></path><path><editType>edit</editType><file>pySim/esim/saip/personalization.py</file></path><path><editType>edit</editType><file>tests/unittests/test_configurable_parameters.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/esim/saip/param_source.py</affectedPath><commitId>4307cffc8223260012509a3e231b70e6a7dc24fe</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>param_source: allow plugging a random implementation (for testing)

Change-Id: Idce2b18af70c17844d6f09f7704efc869456ac39
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>4307cffc8223260012509a3e231b70e6a7dc24fe</id><msg>param_source: allow plugging a random implementation (for testing)</msg><path><editType>edit</editType><file>pySim/esim/saip/param_source.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_param_src.py</affectedPath><affectedPath>tests/unittests/xo/test_param_src</affectedPath><commitId>b5ba274583cf9988fe266aa5a75f575df8751135</commitId><timestamp>1781987402000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>add test_param_src.py

Change-Id: I03087b84030fddae98b965e0075d44e04ec6ba5c
Jenkins: skip-card-test
</comment><date>2026-06-21 03:30:02 +0700</date><id>b5ba274583cf9988fe266aa5a75f575df8751135</id><msg>add test_param_src.py</msg><path><editType>add</editType><file>tests/unittests/test_param_src.py</file></path><path><editType>add</editType><file>tests/unittests/xo/test_param_src</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></culprit></run></matrixBuild>