github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/worker/diskmanager/diskmanager_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package diskmanager_test 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/storage" 13 coretesting "github.com/juju/juju/testing" 14 "github.com/juju/juju/worker/diskmanager" 15 ) 16 17 var _ = gc.Suite(&DiskManagerWorkerSuite{}) 18 19 type DiskManagerWorkerSuite struct { 20 coretesting.BaseSuite 21 } 22 23 func (s *DiskManagerWorkerSuite) SetUpTest(c *gc.C) { 24 s.BaseSuite.SetUpTest(c) 25 s.PatchValue(diskmanager.BlockDeviceInUse, func(storage.BlockDevice) (bool, error) { 26 return false, nil 27 }) 28 } 29 30 func (s *DiskManagerWorkerSuite) TestWorker(c *gc.C) { 31 done := make(chan struct{}) 32 var setDevices BlockDeviceSetterFunc = func(devices []storage.BlockDevice) error { 33 close(done) 34 return nil 35 } 36 37 var listDevices diskmanager.ListBlockDevicesFunc = func() ([]storage.BlockDevice, error) { 38 return []storage.BlockDevice{{DeviceName: "whatever"}}, nil 39 } 40 41 w := diskmanager.NewWorker(listDevices, setDevices) 42 defer w.Wait() 43 defer w.Kill() 44 45 select { 46 case <-done: 47 case <-time.After(coretesting.LongWait): 48 c.Fatalf("timed out waiting for diskmanager to update") 49 } 50 } 51 52 func (s *DiskManagerWorkerSuite) TestBlockDeviceChanges(c *gc.C) { 53 var oldDevices []storage.BlockDevice 54 var devicesSet [][]storage.BlockDevice 55 var setDevices BlockDeviceSetterFunc = func(devices []storage.BlockDevice) error { 56 devicesSet = append(devicesSet, devices) 57 return nil 58 } 59 60 var listDevices diskmanager.ListBlockDevicesFunc = func() ([]storage.BlockDevice, error) { 61 return []storage.BlockDevice{{DeviceName: "sda"}}, nil 62 } 63 for i := 0; i < 2; i++ { 64 err := diskmanager.DoWork(listDevices, setDevices, &oldDevices) 65 c.Assert(err, jc.ErrorIsNil) 66 } 67 68 listDevices = func() ([]storage.BlockDevice, error) { 69 return []storage.BlockDevice{{DeviceName: "sdb"}}, nil 70 } 71 err := diskmanager.DoWork(listDevices, setDevices, &oldDevices) 72 c.Assert(err, jc.ErrorIsNil) 73 74 // diskmanager only calls the BlockDeviceSetter when it sees 75 // a change in disks. 76 c.Assert(devicesSet, gc.HasLen, 2) 77 c.Assert(devicesSet[0], gc.DeepEquals, []storage.BlockDevice{{ 78 DeviceName: "sda", 79 }}) 80 c.Assert(devicesSet[1], gc.DeepEquals, []storage.BlockDevice{{ 81 DeviceName: "sdb", 82 }}) 83 } 84 85 func (s *DiskManagerWorkerSuite) TestBlockDevicesSorted(c *gc.C) { 86 var devicesSet [][]storage.BlockDevice 87 var setDevices BlockDeviceSetterFunc = func(devices []storage.BlockDevice) error { 88 devicesSet = append(devicesSet, devices) 89 return nil 90 } 91 92 var listDevices diskmanager.ListBlockDevicesFunc = func() ([]storage.BlockDevice, error) { 93 return []storage.BlockDevice{{ 94 DeviceName: "sdb", 95 }, { 96 DeviceName: "sda", 97 }, { 98 DeviceName: "sdc", 99 }}, nil 100 } 101 err := diskmanager.DoWork(listDevices, setDevices, new([]storage.BlockDevice)) 102 c.Assert(err, jc.ErrorIsNil) 103 104 // The block Devices should be sorted when passed to the block 105 // device setter. 106 c.Assert(devicesSet, gc.DeepEquals, [][]storage.BlockDevice{{{ 107 DeviceName: "sda", 108 }, { 109 DeviceName: "sdb", 110 }, { 111 DeviceName: "sdc", 112 }}}) 113 } 114 115 type BlockDeviceSetterFunc func([]storage.BlockDevice) error 116 117 func (f BlockDeviceSetterFunc) SetMachineBlockDevices(devices []storage.BlockDevice) error { 118 return f(devices) 119 }