@@ -296,6 +296,7 @@ func TestMutateOp(t *testing.T) {
296296 "baz" : "quux" ,
297297 "waldo" : "fred" ,
298298 },
299+ FloodVLANs : []int {1 , 2 , 3 },
299300 }
300301 bridgeInfo , err := dbModel .NewModelInfo (& bridge )
301302 require .NoError (t , err )
@@ -383,6 +384,21 @@ func TestMutateOp(t *testing.T) {
383384 assert .Equal (t , diffExternalIds , gotModify ["external_ids" ])
384385 assert .Equal (t , oldExternalIds , gotOld ["external_ids" ])
385386 assert .Equal (t , newExternalIds , gotNew ["external_ids" ])
387+
388+ // Test that attempting to mutate a set to exceed its allowed size results in an error
389+ floodVLANsSchema := bridgeInfo .Metadata .TableSchema .Column ("flood_vlans" )
390+ keyInsert , err := ovsdb .NewOvsSet (floodVLANsSchema .TypeObj .Key .Type , []int {33 })
391+ assert .Nil (t , err )
392+ gotResult , gotUpdate , err = transaction .Mutate (
393+ "Bridge" ,
394+ []ovsdb.Condition {
395+ ovsdb .NewCondition ("_uuid" , ovsdb .ConditionEqual , ovsdb.UUID {GoUUID : bridgeUUID }),
396+ },
397+ []ovsdb.Mutation {
398+ * ovsdb .NewMutation ("flood_vlans" , ovsdb .MutateOperationInsert , keyInsert ),
399+ },
400+ )
401+ assert .Error (t , err )
386402}
387403
388404func TestDiff (t * testing.T ) {
@@ -627,10 +643,12 @@ func TestOvsdbServerUpdate(t *testing.T) {
627643
628644 halloween := MakeOvsSet (t , ovsdb .TypeString , []string {"halloween" })
629645 emptySet := MakeOvsSet (t , ovsdb .TypeString , []string {})
646+ floodVlanSet := MakeOvsSet (t , ovsdb .TypeInteger , []int {1 , 2 , 3 , 4 , 5 , 6 , 7 })
630647 tests := []struct {
631- name string
632- row ovsdb.Row
633- expected * ovsdb.RowUpdate2
648+ name string
649+ row ovsdb.Row
650+ expected * ovsdb.RowUpdate2
651+ expectErr bool
634652 }{
635653 {
636654 "update single field" ,
@@ -640,6 +658,13 @@ func TestOvsdbServerUpdate(t *testing.T) {
640658 "datapath_type" : "waldo" ,
641659 },
642660 },
661+ false ,
662+ },
663+ {
664+ "update single field with too-large array" ,
665+ ovsdb.Row {"flood_vlans" : floodVlanSet },
666+ nil ,
667+ true ,
643668 },
644669 {
645670 "update single optional field, with direct value" ,
@@ -649,6 +674,7 @@ func TestOvsdbServerUpdate(t *testing.T) {
649674 "datapath_id" : halloween ,
650675 },
651676 },
677+ false ,
652678 },
653679 {
654680 "update single optional field, with set" ,
@@ -658,6 +684,7 @@ func TestOvsdbServerUpdate(t *testing.T) {
658684 "datapath_id" : halloween ,
659685 },
660686 },
687+ false ,
661688 },
662689 {
663690 "unset single optional field" ,
@@ -667,6 +694,7 @@ func TestOvsdbServerUpdate(t *testing.T) {
667694 "datapath_id" : emptySet ,
668695 },
669696 },
697+ false ,
670698 },
671699 }
672700 for _ , tt := range tests {
@@ -676,16 +704,20 @@ func TestOvsdbServerUpdate(t *testing.T) {
676704 []ovsdb.Condition {{
677705 Column : "_uuid" , Function : ovsdb .ConditionEqual , Value : ovsdb.UUID {GoUUID : bridgeUUID },
678706 }}, tt .row )
679- assert .NoError (t , err )
680- errs , err := ovsdb .CheckOperationResults ([]ovsdb.OperationResult {res }, []ovsdb.Operation {{Op : "update" }})
681- require .NoErrorf (t , err , "%+v" , errs )
682-
683- bridge .UUID = bridgeUUID
684- row , err := db .Get ("Open_vSwitch" , "Bridge" , bridgeUUID )
685- assert .NoError (t , err )
686- br := row .(* BridgeType )
687- assert .NotEqual (t , br , bridgeRow )
688- assert .Equal (t , tt .expected .Modify , updates ["Bridge" ][bridgeUUID ].Modify )
707+ if tt .expectErr {
708+ require .Error (t , err )
709+ } else {
710+ assert .NoError (t , err )
711+ errs , err := ovsdb .CheckOperationResults ([]ovsdb.OperationResult {res }, []ovsdb.Operation {{Op : "update" }})
712+ require .NoErrorf (t , err , "%+v" , errs )
713+
714+ bridge .UUID = bridgeUUID
715+ row , err := db .Get ("Open_vSwitch" , "Bridge" , bridgeUUID )
716+ assert .NoError (t , err )
717+ br := row .(* BridgeType )
718+ assert .NotEqual (t , br , bridgeRow )
719+ assert .Equal (t , tt .expected .Modify , updates ["Bridge" ][bridgeUUID ].Modify )
720+ }
689721 })
690722 }
691723}
0 commit comments