github.com/contiv/libOpenflow@v0.0.0-20210609050114-d967b14cc688/openflow13/bundles_test.go (about) 1 package openflow13 2 3 import ( 4 "bytes" 5 "errors" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestBundleControl(t *testing.T) { 12 bundleCtrl := &BundleControl{ 13 BundleID: uint32(100), 14 Type: OFPBCT_OPEN_REQUEST, 15 Flags: OFPBCT_ATOMIC, 16 } 17 data, err := bundleCtrl.MarshalBinary() 18 if err != nil { 19 t.Fatalf("Failed to Marshal BundleControl message: %v", err) 20 } 21 bundleCtrl2 := new(BundleControl) 22 err = bundleCtrl2.UnmarshalBinary(data) 23 if err != nil { 24 t.Fatalf("Failed to Unmarshal BundleControl message: %v", err) 25 } 26 if err := bundleCtrlEqual(bundleCtrl, bundleCtrl2); err != nil { 27 t.Errorf(err.Error()) 28 } 29 } 30 31 func TestBundleAdd(t *testing.T) { 32 bundleAdd := &BundleAdd{ 33 BundleID: uint32(100), 34 Flags: OFPBCT_ATOMIC, 35 Message: NewFlowMod(), 36 } 37 38 data, err := bundleAdd.MarshalBinary() 39 if err != nil { 40 t.Fatalf("Failed to Marshal BundleAdd message: %v", err) 41 } 42 bundleAdd2 := new(BundleAdd) 43 err = bundleAdd2.UnmarshalBinary(data) 44 if err != nil { 45 t.Fatalf("Failed to Unmarshal BundleAdd message: %v", err) 46 } 47 if err := bundleAddEqual(bundleAdd, bundleAdd2); err != nil { 48 t.Error(err.Error()) 49 } 50 } 51 52 func TestBundleError(t *testing.T) { 53 bundleError := NewBundleError() 54 bundleError.Code = BEC_TIMEOUT 55 data, err := bundleError.MarshalBinary() 56 if err != nil { 57 t.Fatalf("Failed to Marshal VendorError message: %v", err) 58 } 59 var bundleErr2 VendorError 60 err = bundleErr2.UnmarshalBinary(data) 61 if err != nil { 62 t.Fatalf("Failed to Unmarshal VendorError message: %v", err) 63 } 64 assert.Equal(t, bundleError.Type, bundleErr2.Type) 65 assert.Equal(t, bundleError.Code, bundleErr2.Code) 66 assert.Equal(t, bundleError.ExperimenterID, bundleErr2.ExperimenterID) 67 assert.Equal(t, bundleError.Header.Type, bundleErr2.Header.Type) 68 } 69 70 func TestVendorHeader(t *testing.T) { 71 vh1 := new(VendorHeader) 72 vh1.Header.Type = Type_Experimenter 73 vh1.Header.Length = vh1.Len() 74 vh1.Vendor = uint32(1000) 75 vh1.ExperimenterType = uint32(2000) 76 data, err := vh1.MarshalBinary() 77 if err != nil { 78 t.Fatalf("Failed to Marshal VendorHeader message: %v", err) 79 } 80 var vh2 VendorHeader 81 err = vh2.UnmarshalBinary(data) 82 if err != nil { 83 t.Fatalf("Failed to Unmarshal VendorHeader message: %v", err) 84 } 85 assert.Equal(t, vh1.Header.Type, vh2.Header.Type) 86 assert.Equal(t, vh1.Vendor, vh2.Vendor) 87 assert.Equal(t, vh1.ExperimenterType, vh2.ExperimenterType) 88 } 89 90 func TestBundleControlMessage(t *testing.T) { 91 testFunc := func(oriMessage *VendorHeader) { 92 data, err := oriMessage.MarshalBinary() 93 if err != nil { 94 t.Fatalf("Failed to Marshal message: %v", err) 95 } 96 newMessage := new(VendorHeader) 97 err = newMessage.UnmarshalBinary(data) 98 if err != nil { 99 t.Fatalf("Failed to UnMarshal message: %v", err) 100 } 101 bundleCtrl := oriMessage.VendorData.(*BundleControl) 102 bundleCtrl2, ok := newMessage.VendorData.(*BundleControl) 103 if !ok { 104 t.Fatalf("Failed to cast BundleControl from result") 105 } 106 if err = bundleCtrlEqual(bundleCtrl, bundleCtrl2); err != nil { 107 t.Error(err.Error()) 108 } 109 } 110 111 bundleCtrl := &BundleControl{ 112 BundleID: uint32(100), 113 Type: OFPBCT_OPEN_REQUEST, 114 Flags: OFPBCT_ATOMIC, 115 } 116 msg := NewBundleControl(bundleCtrl) 117 testFunc(msg) 118 } 119 120 func TestBundleAddMessage(t *testing.T) { 121 testFunc := func(oriMessage *VendorHeader) { 122 data, err := oriMessage.MarshalBinary() 123 if err != nil { 124 t.Fatalf("Failed to Marshal message: %v", err) 125 } 126 newMessage := new(VendorHeader) 127 err = newMessage.UnmarshalBinary(data) 128 if err != nil { 129 t.Fatalf("Failed to UnMarshal message: %v", err) 130 } 131 bundleAdd := oriMessage.VendorData.(*BundleAdd) 132 bundleAdd2, ok := newMessage.VendorData.(*BundleAdd) 133 if !ok { 134 t.Fatalf("Failed to cast BundleControl from result") 135 } 136 if err = bundleAddEqual(bundleAdd, bundleAdd2); err != nil { 137 t.Error(err.Error()) 138 } 139 } 140 141 bundleAdd := &BundleAdd{ 142 BundleID: uint32(100), 143 Flags: OFPBCT_ATOMIC, 144 Message: NewFlowMod(), 145 } 146 msg := NewBundleAdd(bundleAdd) 147 testFunc(msg) 148 } 149 150 func bundleCtrlEqual(bundleCtrl, bundleCtrl2 *BundleControl) error { 151 if bundleCtrl.BundleID != bundleCtrl2.BundleID { 152 return errors.New("bundle ID not equal") 153 } 154 if bundleCtrl.Type != bundleCtrl2.Type { 155 return errors.New("bundle Type not equal") 156 } 157 if bundleCtrl.Flags != bundleCtrl2.Flags { 158 return errors.New("bundle Flags not equal") 159 } 160 return nil 161 } 162 163 func bundleAddEqual(bundleAdd, bundleAdd2 *BundleAdd) error { 164 if bundleAdd.BundleID != bundleAdd2.BundleID { 165 return errors.New("bundle ID not equal") 166 } 167 if bundleAdd.Flags != bundleAdd2.Flags { 168 return errors.New("bundle Flags not equal") 169 } 170 msgData, _ := bundleAdd.Message.MarshalBinary() 171 msgData2, err := bundleAdd2.Message.MarshalBinary() 172 if err != nil { 173 return err 174 } 175 if !bytes.Equal(msgData, msgData2) { 176 return errors.New("bundle message not equal") 177 } 178 return nil 179 }