summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_landslide.py2
-rw-r--r--yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_landslide.py210
2 files changed, 201 insertions, 11 deletions
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_landslide.py b/yardstick/network_services/vnf_generic/vnf/tg_landslide.py
index d4222c136..a146b72ca 100644
--- a/yardstick/network_services/vnf_generic/vnf/tg_landslide.py
+++ b/yardstick/network_services/vnf_generic/vnf/tg_landslide.py
@@ -754,7 +754,7 @@ class LandslideTclClient(object):
TEST_NODE_CMD = \
'ls::create -TestNode-{} -under $p_ -Type "eth"' \
' -Phy "{phy}" -Ip "{ip}" -NumLinksOrNodes {numLinksOrNodes}' \
- ' -NextHop "{nextHop}" -Mac "{mac}" -MTU {mtu} ' \
+ ' -NextHop "{nextHop}" -Mac "{mac}" -MTU {mtu}' \
' -ForcedEthInterface "{forcedEthInterface}"' \
' -EthStatsEnabled {ethStatsEnabled}' \
' -VlanId {vlanId} -VlanUserPriority {vlanUserPriority}' \
diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_landslide.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_landslide.py
index d47061c6e..53439972a 100644
--- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_landslide.py
+++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_landslide.py
@@ -609,8 +609,9 @@ class TestLandslideTrafficGen(unittest.TestCase):
def test__load_session_profile(self, mock_upd_ses_tc_params,
mock_upd_ses_suts, mock_upd_ses_ts,
mock_yaml_load, *args):
- self.ls_tg.scenario_helper.scenario_cfg = self.SCENARIO_CFG
- mock_yaml_load.return_value = SESSION_PROFILE
+ self.ls_tg.scenario_helper.scenario_cfg = \
+ copy.deepcopy(self.SCENARIO_CFG)
+ mock_yaml_load.return_value = copy.deepcopy(SESSION_PROFILE)
self.assertIsNone(self.ls_tg._load_session_profile())
self.assertIsNotNone(self.ls_tg.session_profile)
# Number of blocks in configuration files
@@ -631,7 +632,7 @@ class TestLandslideTrafficGen(unittest.TestCase):
vnfd = copy.deepcopy(VNFD['vnfd:vnfd-catalog']['vnfd'][0])
ls_traffic_gen = tg_landslide.LandslideTrafficGen(NAME, vnfd, self._id)
ls_traffic_gen.scenario_helper.scenario_cfg = self.SCENARIO_CFG
- mock_yaml_load.return_value = SESSION_PROFILE
+ mock_yaml_load.return_value = copy.deepcopy(SESSION_PROFILE)
# Delete test_servers item from pod file to make it not valid
ls_traffic_gen.vnfd_helper['config'].pop()
with self.assertRaises(RuntimeError):
@@ -1384,6 +1385,10 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertEqual(auth[0], self.ls_tcl_client._user)
self.assertEqual(len(exec_responses),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call("ls::login 1.1.1.1 user password"),
+ mock.call("ls::get [ls::query LibraryInfo -userLibraryName user] -Id"),
+ ])
def test_connect_login_failed(self, *args):
exec_responses = ['Login failed']
@@ -1399,10 +1404,12 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertIsNone(self.ls_tcl_client._user)
self.assertEqual(len(exec_responses),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_called_with(
+ "ls::login 1.1.1.1 user password")
def test_disconnect(self, *args):
self.ls_tcl_client.disconnect()
- self.mock_tcl_handler.execute.assert_called_once()
+ self.mock_tcl_handler.execute.assert_called_once_with("ls::logout")
self.assertIsNone(self.ls_tcl_client.tcl_server_ip)
self.assertIsNone(self.ls_tcl_client._user)
self.assertIsNone(self.ls_tcl_client._library_id)
@@ -1417,6 +1424,11 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._set_thread_model = mock.Mock()
res = self.ls_tcl_client.create_test_server(TEST_SERVERS[1])
self.assertEqual(3, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::query TsId TestServer_2'),
+ mock.call('set ts [ls::retrieve TsInfo -Name "TestServer_2"]'),
+ mock.call('ls::get $ts -RequestedLicense'),
+ ])
self.ls_tcl_client._set_thread_model.assert_called_once_with(
TEST_SERVERS[1]['name'],
TEST_SERVERS[1]['thread_model'])
@@ -1429,6 +1441,11 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client.create_test_server,
TEST_SERVERS[0])
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::query TsId TestServer_1'),
+ mock.call('ls::perform AddTs -Name "TestServer_1" '
+ '-Ip "192.168.122.101"'),
+ ])
def test__add_test_server(self):
ts_id = '2'
@@ -1436,6 +1453,10 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertEqual(ts_id,
self.ls_tcl_client._add_test_server('name', 'ip'))
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::query TsId name'),
+ mock.call('ls::perform AddTs -Name "name" -Ip "ip"'),
+ ])
def test__add_test_server_failed(self):
self.mock_tcl_handler.execute.side_effect = ['TS not found',
@@ -1443,6 +1464,10 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertRaises(RuntimeError, self.ls_tcl_client._add_test_server,
'name', 'ip')
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::query TsId name'),
+ mock.call('ls::perform AddTs -Name "name" -Ip "ip"'),
+ ])
def test__update_license(self):
curr_lic_id = '111'
@@ -1457,6 +1482,13 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set ts [ls::retrieve TsInfo -Name "name"]'),
+ mock.call('ls::get $ts -RequestedLicense'),
+ mock.call('ls::config $ts -RequestedLicense 222'),
+ mock.call('ls::perform ModifyTs $ts'),
+ ])
+
def test__update_license_same_as_current(self):
curr_lic_id = '111'
new_lic_id = '111'
@@ -1466,6 +1498,10 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._update_license('name')
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set ts [ls::retrieve TsInfo -Name "name"]'),
+ mock.call('ls::get $ts -RequestedLicense'),
+ ])
def test__set_thread_model_update_needed(self):
self.ls_tcl_client._ts_context.vnfd_helper = {
@@ -1478,6 +1514,13 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._set_thread_model('name', 'Fireball')
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set tsc [ls::perform RetrieveTsConfiguration '
+ '-name "name" cfguser_password]'),
+ mock.call('ls::get $tsc -ThreadModel'),
+ mock.call('ls::config $tsc -ThreadModel "V1_FB3"'),
+ mock.call('ls::perform ApplyTsConfiguration $tsc cfguser_password'),
+ ])
def test__set_thread_model_no_update_needed(self):
self.ls_tcl_client._ts_context.vnfd_helper = {
@@ -1490,28 +1533,103 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._set_thread_model('name', 'Legacy')
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set tsc [ls::perform RetrieveTsConfiguration '
+ '-name "name" cfguser_password]'),
+ mock.call('ls::get $tsc -ThreadModel'),
+ ])
@mock.patch.object(tg_landslide.LandslideTclClient,
- 'resolve_test_server_name', return_value='2')
+ 'resolve_test_server_name', side_effect=['4', '2'])
def test_create_test_session(self, *args):
_session_profile = copy.deepcopy(SESSION_PROFILE)
_session_profile['reservations'] = RESERVATIONS
self.ls_tcl_client._save_test_session = mock.Mock()
self.ls_tcl_client._configure_ts_group = mock.Mock()
+ self.ls_tcl_client._library_id = 42
self.ls_tcl_client.create_test_session(_session_profile)
self.assertEqual(17, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set test_ [ls::create TestSession]'),
+ mock.call('ls::config $test_ -Library 42 '
+ '-Name "default_bearer_capacity"'),
+ mock.call('ls::config $test_ -Description ' \
+ '"UE default bearer creation test case"'),
+ mock.call('ls::config $test_ -Keywords ""'),
+ mock.call('ls::config $test_ -Duration "60"'),
+ mock.call('ls::config $test_ -Iterations "1"'),
+ # _configure_reservation
+ mock.call('set reservation_ [ls::create Reservation -under $test_]'),
+ mock.call('ls::config $reservation_ -TsIndex 0 '
+ '-TsId 4 -TsName "TestServer_1"'),
+ mock.call('set physubnet_ [ls::create PhySubnet -under $reservation_]'),
+ mock.call('ls::config $physubnet_ -Name "eth1" -Base "10.42.32.100" '
+ '-Mask "/24" -NumIps 20'),
+ # _configure_reservation
+ mock.call('set reservation_ [ls::create Reservation -under $test_]'),
+ mock.call('ls::config $reservation_ -TsIndex 1 '
+ '-TsId 2 -TsName "TestServer_2"'),
+ mock.call('set physubnet_ [ls::create PhySubnet -under $reservation_]'),
+ mock.call('ls::config $physubnet_ -Name "eth1" -Base "10.42.32.1" '
+ '-Mask "/24" -NumIps 100'),
+ mock.call('set physubnet_ [ls::create PhySubnet -under $reservation_]'),
+ mock.call('ls::config $physubnet_ -Name "eth2" -Base "10.42.33.1" '
+ '-Mask "/24" -NumIps 100'),
+ # _configure_report_options
+ mock.call('ls::config $test_.ReportOptions -Format 1 -Ts -3 -Tc -3'),
+ ])
def test_create_dmf(self):
self.mock_tcl_handler.execute.return_value = '2'
self.ls_tcl_client._save_dmf = mock.Mock()
- self.ls_tcl_client.create_dmf(DMF_CFG)
+ self.ls_tcl_client.create_dmf(copy.deepcopy(DMF_CFG))
self.assertEqual(6, self.mock_tcl_handler.execute.call_count)
+ # This is needed because the dictionary is unordered and the arguments
+ # can come in either order
+ call1 = mock.call(
+ 'ls::config $dmf_ -clientPort 2002 -isClientPortRange "false"')
+ call2 = mock.call(
+ 'ls::config $dmf_ -isClientPortRange "false" -clientPort 2002')
+ self.assertTrue(
+ call1 in self.mock_tcl_handler.execute.mock_calls or
+ call2 in self.mock_tcl_handler.execute.mock_calls)
+
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set dmf_ [ls::create Dmf]'),
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -systemLibraryName test] -Id'),
+ mock.call('ls::config $dmf_ -Library 2 -Name "Basic UDP"'),
+ mock.call('ls::config $dmf_ -dataProtocol "udp"'),
+ # mock.call(
+ # 'ls::config $dmf_ -clientPort 2002 -isClientPortRange "false"'),
+ mock.call('ls::config $dmf_ -serverPort 2003'),
+ ], any_order=True)
def test_configure_dmf(self):
self.mock_tcl_handler.execute.return_value = '2'
self.ls_tcl_client._save_dmf = mock.Mock()
self.ls_tcl_client.configure_dmf(DMF_CFG)
self.assertEqual(6, self.mock_tcl_handler.execute.call_count)
+ # This is need because the dictionary is unordered and the arguments
+ # can come in either order
+ call1 = mock.call(
+ 'ls::config $dmf_ -clientPort 2002 -isClientPortRange "false"')
+ call2 = mock.call(
+ 'ls::config $dmf_ -isClientPortRange "false" -clientPort 2002')
+ self.assertTrue(
+ call1 in self.mock_tcl_handler.execute.mock_calls or
+ call2 in self.mock_tcl_handler.execute.mock_calls)
+
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set dmf_ [ls::create Dmf]'),
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -systemLibraryName test] -Id'),
+ mock.call('ls::config $dmf_ -Library 2 -Name "Basic UDP"'),
+ mock.call('ls::config $dmf_ -dataProtocol "udp"'),
+ # mock.call(
+ # 'ls::config $dmf_ -clientPort 2002 -isClientPortRange "false"'),
+ mock.call('ls::config $dmf_ -serverPort 2003'),
+ ], any_order=True)
def test_delete_dmf(self):
self.assertRaises(NotImplementedError,
@@ -1524,6 +1642,10 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._save_dmf()
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::perform Validate -Dmf $dmf_'),
+ mock.call('ls::save $dmf_ -overwrite'),
+ ])
def test__save_dmf_invalid(self):
exec_resp = ['Invalid', 'List of errors and warnings']
@@ -1532,11 +1654,20 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._save_dmf)
self.assertEqual(len(exec_resp),
self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::perform Validate -Dmf $dmf_'),
+ mock.call('ls::get $dmf_ -ErrorsAndWarnings'),
+ ])
def test__configure_report_options(self):
_options = {'format': 'CSV', 'PerInterval': 'false'}
self.ls_tcl_client._configure_report_options(_options)
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::config $test_.ReportOptions -Format 1 -Ts -3 -Tc -3'),
+ mock.call('ls::config $test_.ReportOptions -PerInterval false'),
+ ],
+ any_order=True)
def test___configure_ts_group(self, *args):
_ts_group = copy.deepcopy(SESSION_PROFILE['tsGroups'][0])
@@ -1545,7 +1676,8 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client.resolve_test_server_name = mock.Mock(
return_value='2')
self.ls_tcl_client._configure_ts_group(_ts_group, 0)
- self.mock_tcl_handler.execute.assert_called_once()
+ self.mock_tcl_handler.execute.assert_called_once_with(
+ 'set tss_ [ls::create TsGroup -under $test_ -tsId 2 ]')
def test___configure_ts_group_resolve_ts_fail(self, *args):
_ts_group = copy.deepcopy(SESSION_PROFILE['tsGroups'][0])
@@ -1579,6 +1711,7 @@ class TestLandslideTclClient(unittest.TestCase):
self.assertRaises(RuntimeError,
self.ls_tcl_client._configure_tc_type,
_tc, 0)
+ self.mock_tcl_handler.assert_not_called()
def test__configure_tc_type_not_found_basic_lib(self):
_tc = copy.deepcopy(SESSION_PROFILE['tsGroups'][0]['testCases'][0])
@@ -1599,18 +1732,28 @@ class TestLandslideTclClient(unittest.TestCase):
"array": ["0"]}
self.ls_tcl_client._configure_array_param('name', _array)
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::create -Array-name -under $p_ ;'),
+ mock.call('ls::create ArrayItem -under $p_.name -Value "0"'),
+ ])
def test__configure_test_node_param(self):
_params = copy.deepcopy(
SESSION_PROFILE['tsGroups'][0]['testCases'][0]['parameters'])
self.ls_tcl_client._configure_test_node_param('SgwUserAddr',
_params['SgwUserAddr'])
- self.mock_tcl_handler.execute.assert_called_once()
+ cmd = ('ls::create -TestNode-SgwUserAddr -under $p_ -Type "eth" '
+ '-Phy "eth1" -Ip "SGW_USER_IP" -NumLinksOrNodes 1 '
+ '-NextHop "SGW_CONTROL_NEXT_HOP" -Mac "" -MTU 1500 '
+ '-ForcedEthInterface "" -EthStatsEnabled false -VlanId 0 '
+ '-VlanUserPriority 0 -NumVlan 1 -UniqueVlanAddr false;')
+ self.mock_tcl_handler.execute.assert_called_once_with(cmd)
def test__configure_sut_param(self):
_params = {'name': 'name'}
self.ls_tcl_client._configure_sut_param('name', _params)
- self.mock_tcl_handler.execute.assert_called_once()
+ self.mock_tcl_handler.execute.assert_called_once_with(
+ 'ls::create -Sut-name -under $p_ -Name "name";')
def test__configure_dmf_param(self):
_params = {"mainflows": [{"library": '111',
@@ -1633,6 +1776,16 @@ class TestLandslideTclClient(unittest.TestCase):
res = self.ls_tcl_client._configure_dmf_param('name', _params)
self.assertEqual(5, self.mock_tcl_handler.execute.call_count)
self.assertIsNone(res)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::create -Dmf-name -under $p_ ;'),
+ mock.call('ls::perform AddDmfMainflow $p_.Dmf 111 "Basic UDP"'),
+ mock.call('ls::config $p_.Dmf.InstanceGroup(0) -mixType '),
+ mock.call('ls::config $p_.Dmf.InstanceGroup(0) -rate 0.0'),
+ mock.call('ls::config $p_.Dmf.InstanceGroup(0).Row(0) -Node 0 '
+ '-OverridePort false -ClientPort 0 -Context 0 -Role 0 '
+ '-PreferredTransport Any -RatingGroup 0 '
+ '-ServiceID 0'),
+ ])
def test__configure_dmf_param_no_instance_groups(self):
_params = {"mainflows": [{"library": '111',
@@ -1641,14 +1794,26 @@ class TestLandslideTclClient(unittest.TestCase):
res = self.ls_tcl_client._configure_dmf_param('name', _params)
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
self.assertIsNone(res)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::create -Dmf-name -under $p_ ;'),
+ mock.call('ls::perform AddDmfMainflow $p_.Dmf 111 "Basic UDP"'),
+ ])
def test__configure_reservation(self):
_reservation = copy.deepcopy(RESERVATIONS[0])
self.ls_tcl_client.resolve_test_server_name = mock.Mock(
- return_value='2')
+ return_value='4')
res = self.ls_tcl_client._configure_reservation(_reservation)
self.assertIsNone(res)
self.assertEqual(4, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('set reservation_ [ls::create Reservation -under $test_]'),
+ mock.call('ls::config $reservation_ -TsIndex 0 -TsId 4 ' + \
+ '-TsName "TestServer_1"'),
+ mock.call('set physubnet_ [ls::create PhySubnet -under $reservation_]'),
+ mock.call('ls::config $physubnet_ -Name "eth1" ' + \
+ '-Base "10.42.32.100" -Mask "/24" -NumIps 20'),
+ ])
def test__configure_preresolved_arp(self):
_arp = [{'StartingAddress': '10.81.1.10',
@@ -1656,6 +1821,9 @@ class TestLandslideTclClient(unittest.TestCase):
res = self.ls_tcl_client._configure_preresolved_arp(_arp)
self.mock_tcl_handler.execute.assert_called_once()
self.assertIsNone(res)
+ self.mock_tcl_handler.execute.assert_called_once_with(
+ 'ls::create PreResolvedArpAddress -under $tss_ ' + \
+ '-StartingAddress "10.81.1.10" -NumNodes 1')
def test__configure_preresolved_arp_none(self):
res = self.ls_tcl_client._configure_preresolved_arp(None)
@@ -1672,24 +1840,40 @@ class TestLandslideTclClient(unittest.TestCase):
res = self.ls_tcl_client._save_test_session()
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
self.assertIsNone(res)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::perform Validate -TestSession $test_'),
+ mock.call('ls::save $test_ -overwrite'),
+ ])
def test__save_test_session_invalid(self):
self.mock_tcl_handler.execute.side_effect = ['Invalid', 'Errors']
self.assertRaises(exceptions.LandslideTclException,
self.ls_tcl_client._save_test_session)
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call('ls::perform Validate -TestSession $test_'),
+ mock.call('ls::get $test_ -ErrorsAndWarnings'),
+ ])
def test__get_library_id_system_lib(self):
self.mock_tcl_handler.execute.return_value = '111'
res = self.ls_tcl_client._get_library_id('name')
self.mock_tcl_handler.execute.assert_called_once()
self.assertEqual('111', res)
+ self.mock_tcl_handler.execute.assert_called_with(
+ 'ls::get [ls::query LibraryInfo -systemLibraryName name] -Id')
def test__get_library_id_user_lib(self):
self.mock_tcl_handler.execute.side_effect = ['Not found', '222']
res = self.ls_tcl_client._get_library_id('name')
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
self.assertEqual('222', res)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -systemLibraryName name] -Id'),
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -userLibraryName name] -Id'),
+ ])
def test__get_library_id_exception(self):
self.mock_tcl_handler.execute.side_effect = ['Not found', 'Not found']
@@ -1697,6 +1881,12 @@ class TestLandslideTclClient(unittest.TestCase):
self.ls_tcl_client._get_library_id,
'name')
self.assertEqual(2, self.mock_tcl_handler.execute.call_count)
+ self.mock_tcl_handler.execute.assert_has_calls([
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -systemLibraryName name] -Id'),
+ mock.call(
+ 'ls::get [ls::query LibraryInfo -userLibraryName name] -Id'),
+ ])
class TestLsTclHandler(unittest.TestCase):