1ca69be21SWalter Erquinigo"""Test the SBEnvironment APIs."""
2ca69be21SWalter Erquinigo
3ca69be21SWalter Erquinigo
4ca69be21SWalter Erquinigo
5ca69be21SWalter Erquinigofrom math import fabs
6ca69be21SWalter Erquinigoimport lldb
7ca69be21SWalter Erquinigofrom lldbsuite.test.decorators import *
8ca69be21SWalter Erquinigofrom lldbsuite.test.lldbtest import *
9ca69be21SWalter Erquinigofrom lldbsuite.test import lldbutil
10ca69be21SWalter Erquinigo
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
29ca69be21SWalter Erquinigo
30ca69be21SWalter Erquinigo
31*ba3d84d8SJonas Devlieghere    @skipIfRemote # Remote environment not supported.
32ca69be21SWalter Erquinigo    def test_platform_environment(self):
33ca69be21SWalter Erquinigo        env = self.dbg.GetSelectedPlatform().GetEnvironment()
34ca69be21SWalter Erquinigo        # We assume at least PATH is set
35ca69be21SWalter Erquinigo        self.assertNotEqual(env.Get("PATH"), None)
36ca69be21SWalter Erquinigo
37ca69be21SWalter Erquinigo
38ca69be21SWalter Erquinigo    def test_launch_info(self):
39ca69be21SWalter Erquinigo        target = self.dbg.CreateTarget("")
40ca69be21SWalter Erquinigo        launch_info = target.GetLaunchInfo()
41ca69be21SWalter Erquinigo        env = launch_info.GetEnvironment()
42ca69be21SWalter Erquinigo        env_count = env.GetNumValues()
43ca69be21SWalter Erquinigo
44ca69be21SWalter Erquinigo        env.Set("FOO", "bar", overwrite=True)
45ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), env_count + 1)
46ca69be21SWalter Erquinigo
47ca69be21SWalter Erquinigo        # Make sure we only modify the copy of the launchInfo's environment
48ca69be21SWalter Erquinigo        self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count)
49ca69be21SWalter Erquinigo
50ca69be21SWalter Erquinigo        launch_info.SetEnvironment(env, append=True)
51ca69be21SWalter Erquinigo        self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count + 1)
52ca69be21SWalter Erquinigo
539cdd68e7SPavel Labath        env.Set("FOO", "baz", overwrite=True)
549cdd68e7SPavel Labath        launch_info.SetEnvironment(env, append=True)
559cdd68e7SPavel Labath        self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count + 1)
569cdd68e7SPavel Labath        self.assertEqual(launch_info.GetEnvironment().Get("FOO"), "baz")
579cdd68e7SPavel Labath
58ca69be21SWalter Erquinigo        # Make sure we can replace the launchInfo's environment
59ca69be21SWalter Erquinigo        env.Clear()
60ca69be21SWalter Erquinigo        env.Set("BAR", "foo", overwrite=True)
61ca69be21SWalter Erquinigo        env.PutEntry("X=y")
62ca69be21SWalter Erquinigo        launch_info.SetEnvironment(env, append=False)
63ca69be21SWalter Erquinigo        self.assertEqualEntries(launch_info.GetEnvironment(), ["BAR=foo", "X=y"])
64ca69be21SWalter Erquinigo
65ca69be21SWalter Erquinigo
66*ba3d84d8SJonas Devlieghere    @skipIfRemote # Remote environment not supported.
67ca69be21SWalter Erquinigo    def test_target_environment(self):
68ca69be21SWalter Erquinigo        env = self.dbg.GetSelectedTarget().GetEnvironment()
69ca69be21SWalter Erquinigo        # There is no target, so env should be empty
70ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), 0)
71ca69be21SWalter Erquinigo        self.assertEqual(env.Get("PATH"), None)
72ca69be21SWalter Erquinigo
73ca69be21SWalter Erquinigo        target = self.dbg.CreateTarget("")
74ca69be21SWalter Erquinigo        env = target.GetEnvironment()
75ca69be21SWalter Erquinigo        path = env.Get("PATH")
76ca69be21SWalter Erquinigo        # Now there's a target, so at least PATH should exist
77ca69be21SWalter Erquinigo        self.assertNotEqual(path, None)
78ca69be21SWalter Erquinigo
79ca69be21SWalter Erquinigo        # Make sure we are getting a copy by modifying the env we just got
80ca69be21SWalter Erquinigo        env.PutEntry("PATH=#" + path)
81ca69be21SWalter Erquinigo        self.assertEqual(target.GetEnvironment().Get("PATH"), path)
82ca69be21SWalter Erquinigo
83ca69be21SWalter Erquinigo    def test_creating_and_modifying_environment(self):
84ca69be21SWalter Erquinigo        env = lldb.SBEnvironment()
85ca69be21SWalter Erquinigo
86ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), None)
87ca69be21SWalter Erquinigo        self.assertEqual(env.Get("BAR"), None)
88ca69be21SWalter Erquinigo
89ca69be21SWalter Erquinigo        # We also test empty values
90ca69be21SWalter Erquinigo        self.assertTrue(env.Set("FOO", "", overwrite=False))
91ca69be21SWalter Erquinigo        env.Set("BAR", "foo", overwrite=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
101ca69be21SWalter Erquinigo        self.assertFalse(env.Set("FOO", "bar", overwrite=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
118ca69be21SWalter Erquinigo        env.SetEntries(entries, append=True)
119ca69be21SWalter Erquinigo        self.assertEqualEntries(env, ["BAR=foo", "X=x", "Y=y"])
120ca69be21SWalter Erquinigo
121ca69be21SWalter Erquinigo        env.SetEntries(entries, append=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)
1269cdd68e7SPavel Labath        env.SetEntries(entries, append=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