go.ligato.io/vpp-agent/v3@v3.5.0/plugins/kvscheduler/utils_for_test.go (about) 1 // Copyright (c) 2018 Cisco and/or its affiliates. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package kvscheduler 16 17 import ( 18 "strings" 19 20 . "github.com/onsi/gomega" 21 "google.golang.org/protobuf/proto" 22 23 . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 24 "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/internal/test" 25 . "go.ligato.io/vpp-agent/v3/proto/ligato/kvscheduler" 26 ) 27 28 const ( 29 descriptor1Name = "descriptor1" 30 descriptor2Name = "descriptor2" 31 descriptor3Name = "descriptor3" 32 33 prefixA = "/prefixA/" 34 prefixB = "/prefixB/" 35 prefixC = "/prefixC/" 36 37 baseValue1 = "base-value1" 38 baseValue2 = "base-value2" 39 baseValue3 = "base-value3" 40 baseValue4 = "base-value4" 41 ) 42 43 type DumpFnc func(string, View) ([]KVWithMetadata, error) 44 45 func prefixSelector(prefix string) func(key string) bool { 46 return func(key string) bool { 47 return strings.HasPrefix(key, prefix) 48 } 49 } 50 51 func checkRecordedValues(recorded, expected []RecordedKVPair) { 52 Expect(len(recorded)).To(Equal(len(expected))) 53 for _, kv := range expected { 54 found := false 55 for _, kv2 := range recorded { 56 if kv2.Key == kv.Key { 57 found = true 58 if kv2.Value != nil && kv.Value != nil { 59 Expect(proto.Equal(kv2.Value.Message, kv.Value.Message)).To(BeTrue()) 60 } 61 Expect(kv2.Origin).To(Equal(kv.Origin)) 62 } 63 } 64 Expect(found).To(BeTrue()) 65 } 66 } 67 68 func checkTxnOperation(recorded, expected *RecordedTxnOp) { 69 Expect(recorded.Operation).To(Equal(expected.Operation)) 70 Expect(recorded.Key).To(Equal(expected.Key)) 71 if recorded.PrevValue != nil && expected.PrevValue != nil { 72 Expect(proto.Equal(recorded.PrevValue, expected.PrevValue)).To(BeTrue()) 73 } 74 if recorded.NewValue != nil && expected.NewValue != nil { 75 Expect(proto.Equal(recorded.NewValue, expected.NewValue)).To(BeTrue()) 76 } 77 Expect(recorded.PrevState).To(Equal(expected.PrevState)) 78 Expect(recorded.NewState).To(Equal(expected.NewState)) 79 if expected.PrevErr == nil { 80 Expect(recorded.PrevErr).To(BeNil()) 81 } else { 82 Expect(recorded.PrevErr).ToNot(BeNil()) 83 Expect(recorded.PrevErr.Error()).To(BeEquivalentTo(expected.PrevErr.Error())) 84 } 85 if expected.NewErr == nil { 86 Expect(recorded.NewErr).To(BeNil()) 87 } else { 88 Expect(recorded.NewErr).ToNot(BeNil()) 89 Expect(recorded.NewErr.Error()).To(BeEquivalentTo(expected.NewErr.Error())) 90 } 91 Expect(recorded.NOOP).To(Equal(expected.NOOP)) 92 Expect(recorded.IsDerived).To(Equal(expected.IsDerived)) 93 Expect(recorded.IsProperty).To(Equal(expected.IsProperty)) 94 Expect(recorded.IsRevert).To(Equal(expected.IsRevert)) 95 Expect(recorded.IsRetry).To(Equal(expected.IsRetry)) 96 Expect(recorded.IsRecreate).To(Equal(expected.IsRecreate)) 97 } 98 99 func checkTxnOperations(recorded, expected RecordedTxnOps) { 100 Expect(recorded).To(HaveLen(len(expected))) 101 for idx, recordedOp := range recorded { 102 checkTxnOperation(recordedOp, expected[idx]) 103 } 104 } 105 106 func checkValues(received, expected []KVWithMetadata) { 107 Expect(received).To(HaveLen(len(expected))) 108 for _, kv := range expected { 109 found := false 110 for _, kv2 := range received { 111 if kv2.Key == kv.Key { 112 found = true 113 Expect(kv2.Origin).To(BeEquivalentTo(kv.Origin)) 114 Expect(proto.Equal(kv2.Value, kv.Value)).To(BeTrue()) 115 if kv.Metadata == nil { 116 Expect(kv2.Metadata).To(BeNil()) 117 } else { 118 Expect(kv2.Metadata).ToNot(BeNil()) 119 expIntMeta := kv.Metadata.(*test.OnlyInteger) 120 receivedMeta := kv2.Metadata.(*test.OnlyInteger) 121 Expect(receivedMeta.GetInteger()).To(BeEquivalentTo(expIntMeta.GetInteger())) 122 } 123 } 124 } 125 Expect(found).To(BeTrue()) 126 } 127 } 128 129 func checkBaseValueStatus(received, expected *BaseValueStatus) { 130 checkValueStatus(received.Value, expected.Value) 131 Expect(received.DerivedValues).To(HaveLen(len(expected.DerivedValues))) 132 for _, expDer := range expected.DerivedValues { 133 found := false 134 for _, recvDer := range received.DerivedValues { 135 if expDer.Key == recvDer.Key { 136 checkValueStatus(recvDer, expDer) 137 found = true 138 break 139 } 140 } 141 Expect(found).To(BeTrue()) 142 } 143 } 144 145 func checkValueStatus(received, expected *ValueStatus) { 146 Expect(received.Error).To(BeEquivalentTo(expected.Error)) 147 Expect(received.State).To(BeEquivalentTo(expected.State)) 148 Expect(received.LastOperation).To(BeEquivalentTo(expected.LastOperation)) 149 Expect(equalStringArrays(received.Details, expected.Details)).To(BeTrue()) 150 } 151 152 func equalStringArrays(sa1, sa2 []string) bool { 153 if len(sa1) != len(sa2) { 154 return false 155 } 156 for _, s1 := range sa1 { 157 found := false 158 for _, s2 := range sa2 { 159 if s1 == s2 { 160 found = true 161 break 162 } 163 } 164 if !found { 165 return false 166 } 167 } 168 return true 169 }