@@ -12,7 +12,7 @@ import (
1212 "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/symlinks"
1313)
1414
15- func TestDoesLinkExist (t * testing.T ) {
15+ func TestLinkExist (t * testing.T ) {
1616 tmpDir := t .TempDir ()
1717 require .NoError (
1818 t ,
@@ -22,21 +22,23 @@ func TestDoesLinkExist(t *testing.T) {
2222 ),
2323 )
2424
25- exists , err := doesLinkExist ("d" , filepath .Join (tmpDir , "/a/b/c" ))
25+ exists , err := linkExists ("d" , filepath .Join (tmpDir , "/a/b/c" ))
2626 require .NoError (t , err )
2727 require .True (t , exists )
2828
29- exists , err = doesLinkExist ("/a/b/f" , filepath .Join (tmpDir , "/a/b/e" ))
29+ exists , err = linkExists ("/a/b/f" , filepath .Join (tmpDir , "/a/b/e" ))
3030 require .NoError (t , err )
3131 require .True (t , exists )
3232
33- _ , err = doesLinkExist ("different-target" , filepath .Join (tmpDir , "/a/b/c" ))
34- require .Error (t , err )
33+ exists , err = linkExists ("different-target" , filepath .Join (tmpDir , "/a/b/c" ))
34+ require .NoError (t , err )
35+ require .False (t , exists )
3536
36- _ , err = doesLinkExist ("/a/b/d" , filepath .Join (tmpDir , "/a/b/c" ))
37- require .Error (t , err )
37+ exists , err = linkExists ("/a/b/d" , filepath .Join (tmpDir , "/a/b/c" ))
38+ require .NoError (t , err )
39+ require .False (t , exists )
3840
39- exists , err = doesLinkExist ("foo" , filepath .Join (tmpDir , "/a/b/does-not-exist" ))
41+ exists , err = linkExists ("foo" , filepath .Join (tmpDir , "/a/b/does-not-exist" ))
4042 require .NoError (t , err )
4143 require .False (t , exists )
4244}
@@ -190,43 +192,55 @@ func TestCreateLinkAbsolutePath(t *testing.T) {
190192}
191193
192194func TestCreateLinkAlreadyExists (t * testing.T ) {
193- tmpDir := t .TempDir ()
194- hostRoot := filepath .Join (tmpDir , "/host-root/" )
195- containerRoot := filepath .Join (tmpDir , "/container-root" )
196-
197- require .NoError (t , makeFs (hostRoot ))
198- require .NoError (t , makeFs (containerRoot , dirOrLink {path : "/lib/libfoo.so" , target : "libfoo.so.1" }))
199-
200- // nvidia-cdi-hook create-symlinks --link libfoo.so.1::/lib/libfoo.so
201- err := getTestCommand ().createLink (containerRoot , "libfoo.so.1" , "/lib/libfoo.so" )
202- require .NoError (t , err )
203- target , err := symlinks .Resolve (filepath .Join (containerRoot , "lib/libfoo.so" ))
204- require .NoError (t , err )
205- require .Equal (t , "libfoo.so.1" , target )
206- }
195+ testCases := []struct {
196+ description string
197+ containerContents []dirOrLink
198+ shouldExist []string
199+ }{
200+ {
201+ description : "link already exists with correct target" ,
202+ containerContents : []dirOrLink {{path : "/lib/libfoo.so" , target : "libfoo.so.1" }},
203+ shouldExist : []string {},
204+ },
205+ {
206+ description : "link already exists with different target" ,
207+ containerContents : []dirOrLink {{path : "/lib/libfoo.so" , target : "different-target" }, {path : "different-target" }},
208+ shouldExist : []string {"{{ .containerRoot }}/different-target" },
209+ },
210+ }
207211
208- func TestCreateLinkAlreadyExistsDifferentTarget (t * testing.T ) {
209- tmpDir := t .TempDir ()
210- hostRoot := filepath .Join (tmpDir , "/host-root/" )
211- containerRoot := filepath .Join (tmpDir , "/container-root" )
212+ for _ , tc := range testCases {
213+ t .Run (tc .description , func (t * testing.T ) {
214+ tmpDir := t .TempDir ()
215+ hostRoot := filepath .Join (tmpDir , "/host-root/" )
216+ containerRoot := filepath .Join (tmpDir , "/container-root" )
217+ require .NoError (t , makeFs (hostRoot ))
218+ require .NoError (t , makeFs (containerRoot , tc .containerContents ... ))
212219
213- require .NoError (t , makeFs (hostRoot ))
214- require .NoError (t , makeFs (containerRoot , dirOrLink {path : "/lib/libfoo.so" , target : "different-target" }))
220+ // nvidia-cdi-hook create-symlinks --link libfoo.so.1::/lib/libfoo.so
221+ err := getTestCommand ().createLink (containerRoot , "libfoo.so.1" , "/lib/libfoo.so" )
222+ require .NoError (t , err )
223+ target , err := symlinks .Resolve (filepath .Join (containerRoot , "lib/libfoo.so" ))
224+ require .NoError (t , err )
225+ require .Equal (t , "libfoo.so.1" , target )
215226
216- // nvidia-cdi-hook create-symlinks --link libfoo.so.1::/lib/libfoo.so
217- err := getTestCommand ().createLink (containerRoot , "libfoo.so.1" , "/lib/libfoo.so" )
218- require .Error (t , err )
219- target , err := symlinks .Resolve (filepath .Join (containerRoot , "lib/libfoo.so" ))
220- require .NoError (t , err )
221- require .Equal (t , "different-target" , target )
227+ for _ , p := range tc .shouldExist {
228+ require .DirExists (t , strings .ReplaceAll (p , "{{ .containerRoot }}" , containerRoot ))
229+ }
230+ })
231+ }
222232}
223233
224234func TestCreateLinkOutOfBounds (t * testing.T ) {
225235 tmpDir := t .TempDir ()
226- hostRoot := filepath .Join (tmpDir , "/host-root/ " )
236+ hostRoot := filepath .Join (tmpDir , "/host-root" )
227237 containerRoot := filepath .Join (tmpDir , "/container-root" )
228238
229- require .NoError (t , makeFs (hostRoot ))
239+ require .NoError (t ,
240+ makeFs (hostRoot ,
241+ dirOrLink {path : "libfoo.so" },
242+ ),
243+ )
230244 require .NoError (t ,
231245 makeFs (containerRoot ,
232246 dirOrLink {path : "/lib" },
@@ -240,12 +254,13 @@ func TestCreateLinkOutOfBounds(t *testing.T) {
240254
241255 // nvidia-cdi-hook create-symlinks --link ../libfoo.so.1::/lib/foo/libfoo.so
242256 _ = getTestCommand ().createLink (containerRoot , "../libfoo.so.1" , "/lib/foo/libfoo.so" )
243- // TODO: We need to enabled this check once we have updated the implementation.
244- // require.Error(t, err)
245- _ , err = os .Lstat (filepath .Join (hostRoot , "libfoo.so" ))
246- require .ErrorIs (t , err , os .ErrNotExist )
247- _ , err = os .Lstat (filepath .Join (containerRoot , hostRoot , "libfoo.so" ))
248257 require .NoError (t , err )
258+
259+ target , err := symlinks .Resolve (filepath .Join (containerRoot , hostRoot , "libfoo.so" ))
260+ require .NoError (t , err )
261+ require .Equal (t , "../libfoo.so.1" , target )
262+
263+ require .DirExists (t , filepath .Join (hostRoot , "libfoo.so" ))
249264}
250265
251266type dirOrLink struct {
0 commit comments