xref: /llvm-project/lldb/test/API/python_api/sbenvironment/TestSBEnvironment.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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