1ca69be21SWalter Erquinigo"""Test the SBEnvironment APIs.""" 2ca69be21SWalter Erquinigo 3ca69be21SWalter Erquinigo 4ca69be21SWalter Erquinigofrom math import fabs 5ca69be21SWalter Erquinigoimport lldb 6ca69be21SWalter Erquinigofrom lldbsuite.test.decorators import * 7ca69be21SWalter Erquinigofrom lldbsuite.test.lldbtest import * 8ca69be21SWalter Erquinigofrom lldbsuite.test import lldbutil 9ca69be21SWalter Erquinigo 10*2238dcc3SJonas Devlieghere 11ca69be21SWalter Erquinigoclass SBEnvironmentAPICase(TestBase): 12ca69be21SWalter Erquinigo NO_DEBUG_INFO_TESTCASE = True 13ca69be21SWalter Erquinigo 14ca69be21SWalter Erquinigo # We use this function to test both kind of accessors: 15ca69be21SWalter Erquinigo # . Get*AtIndex and GetEntries 16ca69be21SWalter Erquinigo def assertEqualEntries(self, env, entries): 17ca69be21SWalter Erquinigo self.assertEqual(env.GetNumValues(), len(entries)) 18ca69be21SWalter Erquinigo for i in range(env.GetNumValues()): 19ca69be21SWalter Erquinigo name = env.GetNameAtIndex(i) 20ca69be21SWalter Erquinigo value = env.GetValueAtIndex(i) 21ca69be21SWalter Erquinigo self.assertIn(name + "=" + value, entries) 22ca69be21SWalter Erquinigo 23ca69be21SWalter Erquinigo entries = env.GetEntries() 24ca69be21SWalter Erquinigo self.assertEqual(entries.GetSize(), len(entries)) 25ca69be21SWalter Erquinigo for i in range(entries.GetSize()): 26ca69be21SWalter Erquinigo (name, value) = entries.GetStringAtIndex(i).split("=") 27ca69be21SWalter Erquinigo self.assertIn(name + "=" + value, entries) 28ca69be21SWalter Erquinigo 29ba3d84d8SJonas Devlieghere @skipIfRemote # Remote environment not supported. 30ca69be21SWalter Erquinigo def test_platform_environment(self): 31ca69be21SWalter Erquinigo env = self.dbg.GetSelectedPlatform().GetEnvironment() 32ca69be21SWalter Erquinigo # We assume at least PATH is set 33ca69be21SWalter Erquinigo self.assertNotEqual(env.Get("PATH"), None) 34ca69be21SWalter Erquinigo 35ca69be21SWalter Erquinigo def test_launch_info(self): 36ca69be21SWalter Erquinigo target = self.dbg.CreateTarget("") 37ca69be21SWalter Erquinigo launch_info = target.GetLaunchInfo() 38ca69be21SWalter Erquinigo env = launch_info.GetEnvironment() 39ca69be21SWalter Erquinigo env_count = env.GetNumValues() 40ca69be21SWalter Erquinigo 4182a46cd2SJordan Rupprecht env.Set("FOO", "bar", True) 42ca69be21SWalter Erquinigo self.assertEqual(env.GetNumValues(), env_count + 1) 43ca69be21SWalter Erquinigo 44ca69be21SWalter Erquinigo # Make sure we only modify the copy of the launchInfo's environment 45ca69be21SWalter Erquinigo self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count) 46ca69be21SWalter Erquinigo 4782a46cd2SJordan Rupprecht # Note: swig >= 3.0.3 can use named parameters, omit to support <= 3.0.2. 4882a46cd2SJordan Rupprecht # i.e. launch_info.SetEnvironment(env, append=True) 4982a46cd2SJordan Rupprecht launch_info.SetEnvironment(env, True) 50ca69be21SWalter Erquinigo self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count + 1) 51ca69be21SWalter Erquinigo 5282a46cd2SJordan Rupprecht env.Set("FOO", "baz", True) 5382a46cd2SJordan Rupprecht launch_info.SetEnvironment(env, True) 549cdd68e7SPavel Labath self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count + 1) 559cdd68e7SPavel Labath self.assertEqual(launch_info.GetEnvironment().Get("FOO"), "baz") 569cdd68e7SPavel Labath 57ca69be21SWalter Erquinigo # Make sure we can replace the launchInfo's environment 58ca69be21SWalter Erquinigo env.Clear() 5982a46cd2SJordan Rupprecht env.Set("BAR", "foo", True) 60ca69be21SWalter Erquinigo env.PutEntry("X=y") 6182a46cd2SJordan Rupprecht launch_info.SetEnvironment(env, False) 62ca69be21SWalter Erquinigo self.assertEqualEntries(launch_info.GetEnvironment(), ["BAR=foo", "X=y"]) 63ca69be21SWalter Erquinigo 64ba3d84d8SJonas Devlieghere @skipIfRemote # Remote environment not supported. 65ca69be21SWalter Erquinigo def test_target_environment(self): 66ca69be21SWalter Erquinigo env = self.dbg.GetSelectedTarget().GetEnvironment() 67ca69be21SWalter Erquinigo # There is no target, so env should be empty 68ca69be21SWalter Erquinigo self.assertEqual(env.GetNumValues(), 0) 69ca69be21SWalter Erquinigo self.assertEqual(env.Get("PATH"), None) 70ca69be21SWalter Erquinigo 71ca69be21SWalter Erquinigo target = self.dbg.CreateTarget("") 72ca69be21SWalter Erquinigo env = target.GetEnvironment() 73ca69be21SWalter Erquinigo path = env.Get("PATH") 74ca69be21SWalter Erquinigo # Now there's a target, so at least PATH should exist 75ca69be21SWalter Erquinigo self.assertNotEqual(path, None) 76ca69be21SWalter Erquinigo 77ca69be21SWalter Erquinigo # Make sure we are getting a copy by modifying the env we just got 78ca69be21SWalter Erquinigo env.PutEntry("PATH=#" + path) 79ca69be21SWalter Erquinigo self.assertEqual(target.GetEnvironment().Get("PATH"), path) 80ca69be21SWalter Erquinigo 81ca69be21SWalter Erquinigo def test_creating_and_modifying_environment(self): 82ca69be21SWalter Erquinigo env = lldb.SBEnvironment() 83ca69be21SWalter Erquinigo 84ca69be21SWalter Erquinigo self.assertEqual(env.Get("FOO"), None) 85ca69be21SWalter Erquinigo self.assertEqual(env.Get("BAR"), None) 86ca69be21SWalter Erquinigo 87ca69be21SWalter Erquinigo # We also test empty values 8882a46cd2SJordan Rupprecht # Note: swig >= 3.0.3 can use named parameters, omit to support <= 3.0.2. 8982a46cd2SJordan Rupprecht # i.e. env.Set("FOO", "", overwrite=False) 9082a46cd2SJordan Rupprecht self.assertTrue(env.Set("FOO", "", False)) 9182a46cd2SJordan Rupprecht env.Set("BAR", "foo", False) 92ca69be21SWalter Erquinigo 93ca69be21SWalter Erquinigo self.assertEqual(env.Get("FOO"), "") 94ca69be21SWalter Erquinigo self.assertEqual(env.Get("BAR"), "foo") 95ca69be21SWalter Erquinigo 96ca69be21SWalter Erquinigo self.assertEqual(env.GetNumValues(), 2) 97ca69be21SWalter Erquinigo 98ca69be21SWalter Erquinigo self.assertEqualEntries(env, ["FOO=", "BAR=foo"]) 99ca69be21SWalter Erquinigo 100ca69be21SWalter Erquinigo # Make sure modifications work 10182a46cd2SJordan Rupprecht self.assertFalse(env.Set("FOO", "bar", False)) 102ca69be21SWalter Erquinigo self.assertEqual(env.Get("FOO"), "") 103ca69be21SWalter Erquinigo 104ca69be21SWalter Erquinigo env.PutEntry("FOO=bar") 105ca69be21SWalter Erquinigo self.assertEqual(env.Get("FOO"), "bar") 106ca69be21SWalter Erquinigo 107ca69be21SWalter Erquinigo self.assertEqualEntries(env, ["FOO=bar", "BAR=foo"]) 108ca69be21SWalter Erquinigo 109ca69be21SWalter Erquinigo # Make sure we can unset 110ca69be21SWalter Erquinigo self.assertTrue(env.Unset("FOO")) 111ca69be21SWalter Erquinigo self.assertFalse(env.Unset("FOO")) 112ca69be21SWalter Erquinigo self.assertEqual(env.Get("FOO"), None) 113ca69be21SWalter Erquinigo 114ca69be21SWalter Erquinigo # Test SetEntries 115ca69be21SWalter Erquinigo entries = lldb.SBStringList() 116ca69be21SWalter Erquinigo entries.AppendList(["X=x", "Y=y"], 2) 117ca69be21SWalter Erquinigo 11882a46cd2SJordan Rupprecht env.SetEntries(entries, True) 119ca69be21SWalter Erquinigo self.assertEqualEntries(env, ["BAR=foo", "X=x", "Y=y"]) 120ca69be21SWalter Erquinigo 12182a46cd2SJordan Rupprecht env.SetEntries(entries, False) 122ca69be21SWalter Erquinigo self.assertEqualEntries(env, ["X=x", "Y=y"]) 123ca69be21SWalter Erquinigo 1249cdd68e7SPavel Labath entries.Clear() 1259cdd68e7SPavel Labath entries.AppendList(["X=y", "Y=x"], 2) 12682a46cd2SJordan Rupprecht env.SetEntries(entries, True) 1279cdd68e7SPavel Labath self.assertEqualEntries(env, ["X=y", "Y=x"]) 1289cdd68e7SPavel Labath 129ca69be21SWalter Erquinigo # Test clear 130ca69be21SWalter Erquinigo env.Clear() 131ca69be21SWalter Erquinigo self.assertEqualEntries(env, []) 132