@@ -8,11 +8,13 @@ import (
88 "testing"
99 "time"
1010
11+ "github.com/spf13/afero"
1112 "github.com/stretchr/testify/assert"
1213 "go.uber.org/mock/gomock"
1314
1415 mockexec "github.com/netapp/trident/mocks/mock_utils/mock_exec"
1516 "github.com/netapp/trident/mocks/mock_utils/mock_models/mock_luks"
17+ "github.com/netapp/trident/utils/errors"
1618)
1719
1820// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -266,3 +268,85 @@ func TestRemoveMultipathDeviceMapping(t *testing.T) {
266268 })
267269 }
268270}
271+
272+ func TestWaitForDevicesRemoval (t * testing.T ) {
273+ errMsg := "timed out waiting for devices to be removed"
274+ tests := map [string ]struct {
275+ name string
276+ devicePathPrefix string
277+ deviceNames []string
278+ getOsFs func () (afero.Fs , error )
279+ maxWaitTime time.Duration
280+ expectedError error
281+ }{
282+ "Devices removed successfully" : {
283+ devicePathPrefix : "/dev" ,
284+ deviceNames : []string {"sda" , "sdb" },
285+ getOsFs : func () (afero.Fs , error ) {
286+ return afero .NewMemMapFs (), nil
287+ },
288+ maxWaitTime : 1 * time .Second ,
289+ expectedError : nil ,
290+ },
291+ "Timeout waiting for devices to be removed" : {
292+ devicePathPrefix : "/dev" ,
293+ deviceNames : []string {"sda" , "sdb" },
294+ getOsFs : func () (afero.Fs , error ) {
295+ osFs := afero .NewMemMapFs ()
296+ _ , err := osFs .Create ("/dev/sda" )
297+ if err != nil {
298+ return nil , err
299+ }
300+ _ , err = osFs .Create ("/dev/sdb" )
301+ if err != nil {
302+ return nil , err
303+ }
304+ return osFs , nil
305+ },
306+ maxWaitTime : 1 * time .Second ,
307+ expectedError : errors .TimeoutError (errMsg ),
308+ },
309+ "Timeout waiting for last device to be removed" : {
310+ devicePathPrefix : "/dev" ,
311+ deviceNames : []string {"sda" , "sdb" },
312+ getOsFs : func () (afero.Fs , error ) {
313+ osFs := afero .NewMemMapFs ()
314+ _ , err := osFs .Create ("/dev/sdb" )
315+ if err != nil {
316+ return nil , err
317+ }
318+ return osFs , nil
319+ },
320+ maxWaitTime : 1 * time .Second ,
321+ expectedError : errors .TimeoutError (errMsg ),
322+ },
323+ "Timeout waiting for first device to be removed" : {
324+ devicePathPrefix : "/dev" ,
325+ deviceNames : []string {"sda" , "sdb" },
326+ getOsFs : func () (afero.Fs , error ) {
327+ osFs := afero .NewMemMapFs ()
328+ _ , err := osFs .Create ("/dev/sda" )
329+ if err != nil {
330+ return nil , err
331+ }
332+ return osFs , nil
333+ },
334+ maxWaitTime : 1 * time .Second ,
335+ expectedError : errors .TimeoutError (errMsg ),
336+ },
337+ }
338+
339+ for name , params := range tests {
340+ t .Run (name , func (t * testing.T ) {
341+ fs , err := params .getOsFs ()
342+ assert .NoError (t , err )
343+ err = waitForDevicesRemoval (context .Background (), fs , params .devicePathPrefix , params .deviceNames ,
344+ params .maxWaitTime )
345+ if params .expectedError != nil {
346+ assert .EqualError (t , err , params .expectedError .Error ())
347+ } else {
348+ assert .NoError (t , err )
349+ }
350+ })
351+ }
352+ }
0 commit comments