@@ -63,6 +63,35 @@ var mockSnapInfo = &snap.Info{
6363 Revision : snap .R (17 ),
6464 },
6565}
66+ var mockSnapInfoWithDesktopFile = func () * snap.Info {
67+ mi := * mockSnapInfo
68+ mi .Plugs = map [string ]* snap.PlugInfo {
69+ "desktop" : {
70+ Snap : & mi ,
71+ Interface : "desktop" ,
72+ Name : "desktop" ,
73+ Attrs : map [string ]any {
74+ "desktop-file-ids" : []any {"io.snapcraft.foo.bar.desktop" },
75+ },
76+ },
77+ }
78+ return & mi
79+ }()
80+ var mockAppInfo = & snap.AppInfo {
81+ Snap : mockSnapInfo ,
82+ Name : "bar" ,
83+ CommonID : "io.snapcraft.foo.bar" ,
84+ BusName : "io.snapcraft.foo.bar.bus" ,
85+ }
86+ var mockAppInfoWithDesktopFile = func () * snap.AppInfo {
87+ mai := * mockAppInfo
88+ mai .Snap = mockSnapInfoWithDesktopFile
89+ return & mai
90+ }()
91+ var mockAppInfoMinimal = & snap.AppInfo {
92+ Snap : mockSnapInfo ,
93+ Name : "bar" ,
94+ }
6695var mockComponentInfo = & snap.ComponentInfo {
6796 Component : naming.ComponentRef {
6897 SnapName : "foo" ,
@@ -94,6 +123,10 @@ var mockClassicSnapInfo = &snap.Info{
94123func (s * HTestSuite ) SetUpTest (c * C ) {
95124 s .BaseTest .SetUpTest (c )
96125 s .BaseTest .AddCleanup (snap .MockSanitizePlugsSlots (func (snapInfo * snap.Info ) {}))
126+
127+ defaultDesktopFilesDir := dirs .SnapDesktopFilesDir
128+ dirs .SnapDesktopFilesDir = c .MkDir ()
129+ s .BaseTest .AddCleanup (func () { dirs .SnapDesktopFilesDir = defaultDesktopFilesDir })
97130}
98131
99132func (s * HTestSuite ) TearDownTest (c * C ) {
@@ -160,6 +193,47 @@ func (ts *HTestSuite) TestBasicWithSources(c *C) {
160193 })
161194}
162195
196+ func (ts * HTestSuite ) TestAppEnvironment (c * C ) {
197+ env := appEnv (mockSnapInfo , mockAppInfo )
198+ c .Assert (env , DeepEquals , osutil.Environment {
199+ "SNAP_APP_NAME" : "bar" ,
200+ "SNAP_APP_COMMON_ID" : "io.snapcraft.foo.bar" ,
201+ "SNAP_APP_BUS_NAME" : "io.snapcraft.foo.bar.bus" ,
202+ })
203+ }
204+
205+ func (ts * HTestSuite ) testAppDesktopFileEnvironment (c * C , appInfo * snap.AppInfo , desktopFileName string ) {
206+ desktopFilePath := filepath .Join (dirs .SnapDesktopFilesDir , desktopFileName )
207+ desktopFile := fmt .Sprintf (`[Desktop Entry]
208+ Exec=%s
209+ X-SnapInstanceName=%s
210+ X-SnapAppName=%s
211+ ` , appInfo .Command , appInfo .Snap .InstanceName (), appInfo .Name )
212+ c .Assert (os .WriteFile (desktopFilePath , []byte (desktopFile ), 0644 ), IsNil )
213+
214+ c .Assert (appInfo .DesktopFile (), Equals , desktopFilePath )
215+
216+ env := appEnv (appInfo .Snap , appInfo )
217+ c .Assert (env , DeepEquals , osutil.Environment {
218+ "SNAP_APP_NAME" : appInfo .Name ,
219+ "SNAP_APP_COMMON_ID" : appInfo .CommonID ,
220+ "SNAP_APP_BUS_NAME" : appInfo .BusName ,
221+ "SNAP_APP_DESKTOP_FILE" : appInfo .DesktopFile (),
222+ })
223+ }
224+
225+ func (ts * HTestSuite ) TestAppWithFallbackDesktopFileIDEnvironment (c * C ) {
226+ ts .testAppDesktopFileEnvironment (c , mockAppInfo , "foo_bar.desktop" )
227+ }
228+
229+ func (ts * HTestSuite ) TestAppWithDesktopFileIDEnvironment (c * C ) {
230+ ts .testAppDesktopFileEnvironment (c , mockAppInfoWithDesktopFile , "io.snapcraft.foo.bar.desktop" )
231+ }
232+
233+ func (ts * HTestSuite ) TestAppWithDesktopFileIDUsingFallbackDesktopFileEnvironment (c * C ) {
234+ ts .testAppDesktopFileEnvironment (c , mockAppInfoWithDesktopFile , "foo_bar.desktop" )
235+ }
236+
163237func (ts * HTestSuite ) TestSaveDataEnvironmentNotPresent (c * C ) {
164238 dirs .SetRootDir (c .MkDir ())
165239 ts .AddCleanup (func () { dirs .SetRootDir ("" ) })
@@ -236,7 +310,7 @@ func (s *HTestSuite) TestSnapRunSnapExecEnv(c *C) {
236310 os .Setenv ("HOME" , "" )
237311 }
238312
239- env := snapEnv (info , nil , nil )
313+ env := snapEnv (info , mockAppInfo , nil , nil )
240314 c .Assert (env , DeepEquals , osutil.Environment {
241315 "SNAP" : fmt .Sprintf ("%s/snapname/42" , dirs .CoreSnapMountDir ),
242316 "SNAP_COMMON" : "/var/snap/snapname/common" ,
@@ -256,6 +330,9 @@ func (s *HTestSuite) TestSnapRunSnapExecEnv(c *C) {
256330 "SNAP_REAL_HOME" : usr .HomeDir ,
257331 "SNAP_UID" : fmt .Sprint (sys .Getuid ()),
258332 "SNAP_EUID" : fmt .Sprint (sys .Geteuid ()),
333+ "SNAP_APP_COMMON_ID" : "io.snapcraft.foo.bar" ,
334+ "SNAP_APP_BUS_NAME" : "io.snapcraft.foo.bar.bus" ,
335+ "SNAP_APP_NAME" : "bar" ,
259336 })
260337 }
261338}
@@ -279,7 +356,7 @@ func (s *HTestSuite) TestParallelInstallSnapRunSnapExecEnv(c *C) {
279356 os .Setenv ("HOME" , "" )
280357 }
281358
282- env := snapEnv (info , nil , nil )
359+ env := snapEnv (info , mockAppInfoMinimal , nil , nil )
283360 c .Check (env , DeepEquals , osutil.Environment {
284361 // Those are mapped to snap-specific directories by
285362 // mount namespace setup
@@ -303,6 +380,7 @@ func (s *HTestSuite) TestParallelInstallSnapRunSnapExecEnv(c *C) {
303380 "SNAP_REAL_HOME" : usr .HomeDir ,
304381 "SNAP_UID" : fmt .Sprint (sys .Getuid ()),
305382 "SNAP_EUID" : fmt .Sprint (sys .Geteuid ()),
383+ "SNAP_APP_NAME" : "bar" ,
306384 })
307385 }
308386}
@@ -355,23 +433,29 @@ func (ts *HTestSuite) TestParallelInstallUserForClassicConfinement(c *C) {
355433func (s * HTestSuite ) TestExtendEnvForRunForNonClassic (c * C ) {
356434 env := osutil.Environment {"TMPDIR" : "/var/tmp" }
357435
358- ExtendEnvForRun (env , mockSnapInfo , nil , nil )
436+ ExtendEnvForRun (env , mockSnapInfo , mockAppInfo , nil , nil )
359437
360438 c .Assert (env ["SNAP_NAME" ], Equals , "foo" )
361439 c .Assert (env ["SNAP_COMMON" ], Equals , "/var/snap/foo/common" )
362440 c .Assert (env ["SNAP_DATA" ], Equals , "/var/snap/foo/17" )
441+ c .Assert (env ["SNAP_APP_NAME" ], Equals , "bar" )
442+ c .Assert (env ["SNAP_APP_COMMON_ID" ], Equals , "io.snapcraft.foo.bar" )
443+ c .Assert (env ["SNAP_APP_BUS_NAME" ], Equals , "io.snapcraft.foo.bar.bus" )
363444
364445 c .Assert (env ["TMPDIR" ], Equals , "/var/tmp" )
365446}
366447
367448func (s * HTestSuite ) TestExtendEnvForRunForClassic (c * C ) {
368449 env := osutil.Environment {"TMPDIR" : "/var/tmp" }
369450
370- ExtendEnvForRun (env , mockClassicSnapInfo , nil , nil )
451+ ExtendEnvForRun (env , mockClassicSnapInfo , mockAppInfoMinimal , nil , nil )
371452
372453 c .Assert (env ["SNAP_NAME" ], Equals , "foo" )
373454 c .Assert (env ["SNAP_COMMON" ], Equals , "/var/snap/foo/common" )
374455 c .Assert (env ["SNAP_DATA" ], Equals , "/var/snap/foo/17" )
456+ c .Assert (env ["SNAP_APP_NAME" ], Equals , "bar" )
457+ c .Assert (func () bool { _ , ok := env ["SNAP_APP_COMMON_ID" ]; return ok }(), Equals , false )
458+ c .Assert (func () bool { _ , ok := env ["SNAP_APP_BUS_NAME" ]; return ok }(), Equals , false )
375459
376460 c .Assert (env ["TMPDIR" ], Equals , "/var/tmp" )
377461}
@@ -392,15 +476,15 @@ func checkEnvWithComp(c *C, env osutil.Environment, compVersion string) {
392476func (s * HTestSuite ) TestExtendEnvForRunWithComponent (c * C ) {
393477 env := osutil.Environment {"TMPDIR" : "/var/tmp" }
394478
395- ExtendEnvForRun (env , mockSnapInfo , mockComponentInfo , nil )
479+ ExtendEnvForRun (env , mockSnapInfo , nil , mockComponentInfo , nil )
396480 compVersion := "1.1"
397481 checkEnvWithComp (c , env , compVersion )
398482}
399483
400484func (s * HTestSuite ) TestExtendEnvForRunWithComponentNoVersion (c * C ) {
401485 env := osutil.Environment {"TMPDIR" : "/var/tmp" }
402486
403- ExtendEnvForRun (env , mockSnapInfo , mockComponentInfoNoVersion , nil )
487+ ExtendEnvForRun (env , mockSnapInfo , nil , mockComponentInfoNoVersion , nil )
404488 // Same as snap in this case
405489 compVersion := "1.0"
406490 checkEnvWithComp (c , env , compVersion )
@@ -425,7 +509,7 @@ func (s *HTestSuite) TestHiddenDirEnv(c *C) {
425509 {dir : dirs .HiddenSnapDataHomeDir , opts : & dirs.SnapDirOptions {HiddenSnapDataDir : true }},
426510 {dir : dirs .HiddenSnapDataHomeDir , opts : & dirs.SnapDirOptions {HiddenSnapDataDir : true , MigratedToExposedHome : true }}} {
427511 env := osutil.Environment {}
428- ExtendEnvForRun (env , mockSnapInfo , nil , t .opts )
512+ ExtendEnvForRun (env , mockSnapInfo , mockAppInfo , nil , t .opts )
429513
430514 c .Check (env ["SNAP_USER_COMMON" ], Equals , filepath .Join (testDir , t .dir , mockSnapInfo .SuggestedName , "common" ))
431515 c .Check (env ["SNAP_USER_DATA" ], DeepEquals , filepath .Join (testDir , t .dir , mockSnapInfo .SuggestedName , mockSnapInfo .Revision .String ()))
0 commit comments