@@ -25,6 +25,7 @@ import (
2525pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
2626
2727"github.com/intel/intel-device-plugins-for-kubernetes/pkg/debug"
28+ dpapi "github.com/intel/intel-device-plugins-for-kubernetes/pkg/deviceplugin"
2829)
2930
3031func init () {
@@ -81,3 +82,157 @@ func TestPostAllocate(t *testing.T) {
8182t .Fatalf ("Set wrong annotation %s" , annotation )
8283}
8384}
85+
86+ func TestNewDevicePlugin (t * testing.T ) {
87+ root , err := ioutil .TempDir ("" , "test_new_device_plugin" )
88+ if err != nil {
89+ t .Fatalf ("can't create temporary directory: %+v" , err )
90+ }
91+ defer os .RemoveAll (root )
92+
93+ tcases := []struct {
94+ name string
95+ mode string
96+ sysfs string
97+ sysfsdirs []string
98+ expectedErr bool
99+ }{
100+ {
101+ name : "valid OPAE af mode" ,
102+ mode : afMode ,
103+ sysfs : path .Join (root , "sys" , "class" , "fpga" ),
104+ sysfsdirs : []string {"intel-fpga-dev.0" },
105+ expectedErr : false ,
106+ },
107+ {
108+ name : "valid DFL af mode" ,
109+ mode : afMode ,
110+ sysfs : path .Join (root , "sys" , "class" , "fpga_region" ),
111+ sysfsdirs : []string {"dfl-port.0" },
112+ expectedErr : false ,
113+ },
114+ {
115+ name : "invalid: af mode: driver is not loaded" ,
116+ mode : afMode ,
117+ sysfs : root ,
118+ expectedErr : true ,
119+ },
120+ {
121+ name : "invalid: region mode: driver is not loaded" ,
122+ mode : regionMode ,
123+ sysfs : root ,
124+ expectedErr : true ,
125+ },
126+ {
127+ name : "invalid: regionDevel mode: driver is not loaded" ,
128+ mode : regionDevelMode ,
129+ sysfs : root ,
130+ expectedErr : true ,
131+ },
132+ }
133+
134+ for _ , tc := range tcases {
135+ t .Run (tc .name , func (t * testing.T ) {
136+ err = createTestDirs ("" , tc .sysfs , nil , tc .sysfsdirs , nil )
137+ if err != nil {
138+ t .Fatal (err )
139+ }
140+
141+ _ , err := newDevicePlugin (tc .mode , root )
142+ if tc .expectedErr && err == nil {
143+ t .Error ("unexpected success" )
144+ }
145+ if ! tc .expectedErr && err != nil {
146+ t .Errorf ("unexpected error: %+v" , err )
147+ }
148+
149+ err = os .RemoveAll (path .Join (root , "sys" ))
150+ if err != nil {
151+ t .Fatalf ("Failed to remove fake sysfs directory: %+v" , err )
152+ }
153+ })
154+ }
155+ }
156+
157+ // fakeNotifier implements Notifier interface.
158+ type fakeNotifier struct {
159+ scanDone chan bool
160+ }
161+
162+ // Notify stops plugin Scan
163+ func (n * fakeNotifier ) Notify (newDeviceTree dpapi.DeviceTree ) {
164+ n .scanDone <- true
165+ }
166+
167+ func TestScan (t * testing.T ) {
168+ root , err := ioutil .TempDir ("" , "test_new_device_plugin" )
169+ if err != nil {
170+ t .Fatalf ("can't create temporary directory: %+v" , err )
171+ }
172+ defer os .RemoveAll (root )
173+
174+ devfs := path .Join (root , "dev" )
175+
176+ tcases := []struct {
177+ name string
178+ mode string
179+ sysfs string
180+ devfsdirs []string
181+ sysfsdirs []string
182+ sysfsfiles map [string ][]byte
183+ expectedErr bool
184+ }{
185+ {
186+ name : "valid OPAE scan" ,
187+ mode : afMode ,
188+ sysfs : path .Join (root , "sys" , "class" , "fpga" ),
189+ sysfsdirs : []string {
190+ "intel-fpga-dev.0/intel-fpga-port.0" ,
191+ "intel-fpga-dev.0/intel-fpga-fme.0/pr" ,
192+ "intel-fpga-dev.1/intel-fpga-port.1" ,
193+ "intel-fpga-dev.1/intel-fpga-fme.1/pr" ,
194+ },
195+ sysfsfiles : map [string ][]byte {
196+ "intel-fpga-dev.0/intel-fpga-port.0/afu_id" : []byte ("d8424dc4a4a3c413f89e433683f9040b\n " ),
197+ "intel-fpga-dev.1/intel-fpga-port.1/afu_id" : []byte ("d8424dc4a4a3c413f89e433683f9040b\n " ),
198+ "intel-fpga-dev.0/intel-fpga-fme.0/pr/interface_id" : []byte ("ce48969398f05f33946d560708be108a\n " ),
199+ "intel-fpga-dev.1/intel-fpga-fme.1/pr/interface_id" : []byte ("ce48969398f05f33946d560708be108a\n " ),
200+ },
201+ devfsdirs : []string {
202+ "intel-fpga-port.0" , "intel-fpga-fme.0" ,
203+ "intel-fpga-port.1" , "intel-fpga-fme.1" ,
204+ },
205+ expectedErr : false ,
206+ },
207+ }
208+
209+ for _ , tc := range tcases {
210+ t .Run (tc .name , func (t * testing.T ) {
211+ err = createTestDirs (devfs , tc .sysfs , tc .devfsdirs , tc .sysfsdirs , tc .sysfsfiles )
212+ if err != nil {
213+ t .Fatal (err )
214+ }
215+
216+ plugin , err := newDevicePlugin (tc .mode , root )
217+ if err != nil {
218+ t .Fatalf ("failed to create a device plugin: %+v" , err )
219+ }
220+
221+ err = plugin .Scan (& fakeNotifier {plugin .scanDone })
222+
223+ if tc .expectedErr && err == nil {
224+ t .Error ("unexpected success" )
225+ }
226+ if ! tc .expectedErr && err != nil {
227+ t .Errorf ("unexpected error: %+v" , err )
228+ }
229+
230+ for _ , dir := range []string {"sys" , "dev" } {
231+ err = os .RemoveAll (path .Join (root , dir ))
232+ if err != nil {
233+ t .Fatalf ("Failed to remove fake sysfs directory: %+v" , err )
234+ }
235+ }
236+ })
237+ }
238+ }
0 commit comments