1*ca69be21SWalter Erquinigo"""Test the SBEnvironment APIs."""
2*ca69be21SWalter Erquinigo
3*ca69be21SWalter Erquinigo
4*ca69be21SWalter Erquinigo
5*ca69be21SWalter Erquinigofrom math import fabs
6*ca69be21SWalter Erquinigoimport lldb
7*ca69be21SWalter Erquinigofrom lldbsuite.test.decorators import *
8*ca69be21SWalter Erquinigofrom lldbsuite.test.lldbtest import *
9*ca69be21SWalter Erquinigofrom lldbsuite.test import lldbutil
10*ca69be21SWalter Erquinigo
11*ca69be21SWalter Erquinigoclass SBEnvironmentAPICase(TestBase):
12*ca69be21SWalter Erquinigo
13*ca69be21SWalter Erquinigo    mydir = TestBase.compute_mydir(__file__)
14*ca69be21SWalter Erquinigo    NO_DEBUG_INFO_TESTCASE = True
15*ca69be21SWalter Erquinigo
16*ca69be21SWalter Erquinigo    # We use this function to test both kind of accessors:
17*ca69be21SWalter Erquinigo    # .  Get*AtIndex and GetEntries
18*ca69be21SWalter Erquinigo    def assertEqualEntries(self, env, entries):
19*ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), len(entries))
20*ca69be21SWalter Erquinigo        for i in range(env.GetNumValues()):
21*ca69be21SWalter Erquinigo            name = env.GetNameAtIndex(i)
22*ca69be21SWalter Erquinigo            value = env.GetValueAtIndex(i)
23*ca69be21SWalter Erquinigo            self.assertIn(name + "=" + value, entries)
24*ca69be21SWalter Erquinigo
25*ca69be21SWalter Erquinigo        entries = env.GetEntries()
26*ca69be21SWalter Erquinigo        self.assertEqual(entries.GetSize(), len(entries))
27*ca69be21SWalter Erquinigo        for i in range(entries.GetSize()):
28*ca69be21SWalter Erquinigo            (name, value) = entries.GetStringAtIndex(i).split("=")
29*ca69be21SWalter Erquinigo            self.assertIn(name + "=" + value, entries)
30*ca69be21SWalter Erquinigo
31*ca69be21SWalter Erquinigo
32*ca69be21SWalter Erquinigo
33*ca69be21SWalter Erquinigo    @add_test_categories(['pyapi'])
34*ca69be21SWalter Erquinigo    def test_platform_environment(self):
35*ca69be21SWalter Erquinigo        env = self.dbg.GetSelectedPlatform().GetEnvironment()
36*ca69be21SWalter Erquinigo        # We assume at least PATH is set
37*ca69be21SWalter Erquinigo        self.assertNotEqual(env.Get("PATH"), None)
38*ca69be21SWalter Erquinigo
39*ca69be21SWalter Erquinigo
40*ca69be21SWalter Erquinigo    @add_test_categories(['pyapi'])
41*ca69be21SWalter Erquinigo    def test_launch_info(self):
42*ca69be21SWalter Erquinigo        target = self.dbg.CreateTarget("")
43*ca69be21SWalter Erquinigo        launch_info = target.GetLaunchInfo()
44*ca69be21SWalter Erquinigo        env = launch_info.GetEnvironment()
45*ca69be21SWalter Erquinigo        env_count = env.GetNumValues()
46*ca69be21SWalter Erquinigo
47*ca69be21SWalter Erquinigo        env.Set("FOO", "bar", overwrite=True)
48*ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), env_count + 1)
49*ca69be21SWalter Erquinigo
50*ca69be21SWalter Erquinigo        # Make sure we only modify the copy of the launchInfo's environment
51*ca69be21SWalter Erquinigo        self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count)
52*ca69be21SWalter Erquinigo
53*ca69be21SWalter Erquinigo        launch_info.SetEnvironment(env, append=True)
54*ca69be21SWalter Erquinigo        self.assertEqual(launch_info.GetEnvironment().GetNumValues(), env_count + 1)
55*ca69be21SWalter Erquinigo
56*ca69be21SWalter Erquinigo        # Make sure we can replace the launchInfo's environment
57*ca69be21SWalter Erquinigo        env.Clear()
58*ca69be21SWalter Erquinigo        env.Set("BAR", "foo", overwrite=True)
59*ca69be21SWalter Erquinigo        env.PutEntry("X=y")
60*ca69be21SWalter Erquinigo        launch_info.SetEnvironment(env, append=False)
61*ca69be21SWalter Erquinigo        self.assertEqualEntries(launch_info.GetEnvironment(), ["BAR=foo", "X=y"])
62*ca69be21SWalter Erquinigo
63*ca69be21SWalter Erquinigo
64*ca69be21SWalter Erquinigo    @add_test_categories(['pyapi'])
65*ca69be21SWalter Erquinigo    def test_target_environment(self):
66*ca69be21SWalter Erquinigo        env = self.dbg.GetSelectedTarget().GetEnvironment()
67*ca69be21SWalter Erquinigo        # There is no target, so env should be empty
68*ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), 0)
69*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("PATH"), None)
70*ca69be21SWalter Erquinigo
71*ca69be21SWalter Erquinigo        target = self.dbg.CreateTarget("")
72*ca69be21SWalter Erquinigo        env = target.GetEnvironment()
73*ca69be21SWalter Erquinigo        path = env.Get("PATH")
74*ca69be21SWalter Erquinigo        # Now there's a target, so at least PATH should exist
75*ca69be21SWalter Erquinigo        self.assertNotEqual(path, None)
76*ca69be21SWalter Erquinigo
77*ca69be21SWalter Erquinigo        # Make sure we are getting a copy by modifying the env we just got
78*ca69be21SWalter Erquinigo        env.PutEntry("PATH=#" + path)
79*ca69be21SWalter Erquinigo        self.assertEqual(target.GetEnvironment().Get("PATH"), path)
80*ca69be21SWalter Erquinigo
81*ca69be21SWalter Erquinigo    @add_test_categories(['pyapi'])
82*ca69be21SWalter Erquinigo    def test_creating_and_modifying_environment(self):
83*ca69be21SWalter Erquinigo        env = lldb.SBEnvironment()
84*ca69be21SWalter Erquinigo
85*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), None)
86*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("BAR"), None)
87*ca69be21SWalter Erquinigo
88*ca69be21SWalter Erquinigo        # We also test empty values
89*ca69be21SWalter Erquinigo        self.assertTrue(env.Set("FOO", "", overwrite=False))
90*ca69be21SWalter Erquinigo        env.Set("BAR", "foo", overwrite=False)
91*ca69be21SWalter Erquinigo
92*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), "")
93*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("BAR"), "foo")
94*ca69be21SWalter Erquinigo
95*ca69be21SWalter Erquinigo        self.assertEqual(env.GetNumValues(), 2)
96*ca69be21SWalter Erquinigo
97*ca69be21SWalter Erquinigo        self.assertEqualEntries(env, ["FOO=", "BAR=foo"])
98*ca69be21SWalter Erquinigo
99*ca69be21SWalter Erquinigo        # Make sure modifications work
100*ca69be21SWalter Erquinigo        self.assertFalse(env.Set("FOO", "bar", overwrite=False))
101*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), "")
102*ca69be21SWalter Erquinigo
103*ca69be21SWalter Erquinigo        env.PutEntry("FOO=bar")
104*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), "bar")
105*ca69be21SWalter Erquinigo
106*ca69be21SWalter Erquinigo        self.assertEqualEntries(env, ["FOO=bar", "BAR=foo"])
107*ca69be21SWalter Erquinigo
108*ca69be21SWalter Erquinigo        # Make sure we can unset
109*ca69be21SWalter Erquinigo        self.assertTrue(env.Unset("FOO"))
110*ca69be21SWalter Erquinigo        self.assertFalse(env.Unset("FOO"))
111*ca69be21SWalter Erquinigo        self.assertEqual(env.Get("FOO"), None)
112*ca69be21SWalter Erquinigo
113*ca69be21SWalter Erquinigo        # Test SetEntries
114*ca69be21SWalter Erquinigo        entries = lldb.SBStringList()
115*ca69be21SWalter Erquinigo        entries.AppendList(["X=x", "Y=y"], 2)
116*ca69be21SWalter Erquinigo
117*ca69be21SWalter Erquinigo        env.SetEntries(entries, append=True)
118*ca69be21SWalter Erquinigo        self.assertEqualEntries(env, ["BAR=foo", "X=x", "Y=y"])
119*ca69be21SWalter Erquinigo
120*ca69be21SWalter Erquinigo        env.SetEntries(entries, append=False)
121*ca69be21SWalter Erquinigo        self.assertEqualEntries(env, ["X=x", "Y=y"])
122*ca69be21SWalter Erquinigo
123*ca69be21SWalter Erquinigo        # Test clear
124*ca69be21SWalter Erquinigo        env.Clear()
125*ca69be21SWalter Erquinigo        self.assertEqualEntries(env, [])
126