@@ -417,39 +417,91 @@ func TestParseWithExpose(t *testing.T) {
417417
418418func TestParseDevice (t * testing.T ) {
419419 skip .If (t , runtime .GOOS != "linux" ) // Windows and macOS validate server-side
420- valids := map [string ]container.DeviceMapping {
421- "/dev/snd" : {
422- PathOnHost : "/dev/snd" ,
423- PathInContainer : "/dev/snd" ,
424- CgroupPermissions : "rwm" ,
425- },
426- "/dev/snd:rw" : {
427- PathOnHost : "/dev/snd" ,
428- PathInContainer : "/dev/snd" ,
429- CgroupPermissions : "rw" ,
430- },
431- "/dev/snd:/something" : {
432- PathOnHost : "/dev/snd" ,
433- PathInContainer : "/something" ,
434- CgroupPermissions : "rwm" ,
435- },
436- "/dev/snd:/something:rw" : {
437- PathOnHost : "/dev/snd" ,
438- PathInContainer : "/something" ,
439- CgroupPermissions : "rw" ,
440- },
441- }
442- for device , deviceMapping := range valids {
443- _ , hostconfig , _ , err := parseRun ([]string {fmt .Sprintf ("--device=%v" , device ), "img" , "cmd" })
444- if err != nil {
445- t .Fatal (err )
446- }
447- if len (hostconfig .Devices ) != 1 {
448- t .Fatalf ("Expected 1 devices, got %v" , hostconfig .Devices )
449- }
450- if hostconfig .Devices [0 ] != deviceMapping {
451- t .Fatalf ("Expected %v, got %v" , deviceMapping , hostconfig .Devices )
452- }
420+ testCases := []struct {
421+ devices []string
422+ deviceMapping * container.DeviceMapping
423+ deviceRequests []container.DeviceRequest
424+ }{
425+ {
426+ devices : []string {"/dev/snd" },
427+ deviceMapping : & container.DeviceMapping {
428+ PathOnHost : "/dev/snd" ,
429+ PathInContainer : "/dev/snd" ,
430+ CgroupPermissions : "rwm" ,
431+ },
432+ },
433+ {
434+ devices : []string {"/dev/snd:rw" },
435+ deviceMapping : & container.DeviceMapping {
436+ PathOnHost : "/dev/snd" ,
437+ PathInContainer : "/dev/snd" ,
438+ CgroupPermissions : "rw" ,
439+ },
440+ },
441+ {
442+ devices : []string {"/dev/snd:/something" },
443+ deviceMapping : & container.DeviceMapping {
444+ PathOnHost : "/dev/snd" ,
445+ PathInContainer : "/something" ,
446+ CgroupPermissions : "rwm" ,
447+ },
448+ },
449+ {
450+ devices : []string {"/dev/snd:/something:rw" },
451+ deviceMapping : & container.DeviceMapping {
452+ PathOnHost : "/dev/snd" ,
453+ PathInContainer : "/something" ,
454+ CgroupPermissions : "rw" ,
455+ },
456+ },
457+ {
458+ devices : []string {"vendor.com/class=name" },
459+ deviceMapping : nil ,
460+ deviceRequests : []container.DeviceRequest {
461+ {
462+ Driver : "cdi" ,
463+ DeviceIDs : []string {"vendor.com/class=name" },
464+ },
465+ },
466+ },
467+ {
468+ devices : []string {"vendor.com/class=name" , "/dev/snd:/something:rw" },
469+ deviceMapping : & container.DeviceMapping {
470+ PathOnHost : "/dev/snd" ,
471+ PathInContainer : "/something" ,
472+ CgroupPermissions : "rw" ,
473+ },
474+ deviceRequests : []container.DeviceRequest {
475+ {
476+ Driver : "cdi" ,
477+ DeviceIDs : []string {"vendor.com/class=name" },
478+ },
479+ },
480+ },
481+ }
482+
483+ for _ , tc := range testCases {
484+ t .Run (fmt .Sprintf ("%s" , tc .devices ), func (t * testing.T ) {
485+ var args []string
486+ for _ , d := range tc .devices {
487+ args = append (args , fmt .Sprintf ("--device=%v" , d ))
488+ }
489+ args = append (args , "img" , "cmd" )
490+
491+ _ , hostconfig , _ , err := parseRun (args )
492+
493+ assert .NilError (t , err )
494+
495+ if tc .deviceMapping != nil {
496+ if assert .Check (t , is .Len (hostconfig .Devices , 1 )) {
497+ assert .Check (t , is .DeepEqual (* tc .deviceMapping , hostconfig .Devices [0 ]))
498+ }
499+ } else {
500+ assert .Check (t , is .Len (hostconfig .Devices , 0 ))
501+ }
502+
503+ assert .Check (t , is .DeepEqual (tc .deviceRequests , hostconfig .DeviceRequests ))
504+ })
453505 }
454506}
455507
0 commit comments