github.com/Jeffail/benthos/v3@v3.65.0/lib/message/util_test.go (about) 1 package message 2 3 import ( 4 "encoding/json" 5 "reflect" 6 "testing" 7 8 "github.com/Jeffail/benthos/v3/lib/message/metadata" 9 ) 10 11 //------------------------------------------------------------------------------ 12 13 func TestGetAllBytes(t *testing.T) { 14 rawBytes := [][]byte{ 15 []byte("foo"), 16 []byte("bar"), 17 []byte("baz"), 18 } 19 m := New(rawBytes) 20 if exp, act := rawBytes, GetAllBytes(m); !reflect.DeepEqual(exp, act) { 21 t.Errorf("Wrong result: %s != %s", act, exp) 22 } 23 } 24 25 func TestSetAllMetadata(t *testing.T) { 26 meta := metadata.New(map[string]string{ 27 "foo": "bar", 28 }) 29 m := New([][]byte{ 30 []byte("foo"), 31 []byte("bar"), 32 []byte("baz"), 33 }) 34 SetAllMetadata(m, meta) 35 if exp, act := "bar", m.Get(0).Metadata().Get("foo"); exp != act { 36 t.Errorf("Wrong result: %v != %v", act, exp) 37 } 38 if exp, act := "bar", m.Get(1).Metadata().Get("foo"); exp != act { 39 t.Errorf("Wrong result: %v != %v", act, exp) 40 } 41 if exp, act := "bar", m.Get(2).Metadata().Get("foo"); exp != act { 42 t.Errorf("Wrong result: %v != %v", act, exp) 43 } 44 } 45 46 func TestCloneGeneric(t *testing.T) { 47 var original interface{} 48 var cloned interface{} 49 50 err := json.Unmarshal([]byte(`{ 51 "root":{ 52 "first":{ 53 "value1": 1, 54 "value2": 1.2, 55 "value3": false, 56 "value4": "hello world" 57 }, 58 "second": [ 59 1, 60 1.2, 61 false, 62 "hello world" 63 ] 64 } 65 }`), &original) 66 if err != nil { 67 t.Fatal(err) 68 } 69 70 if cloned, err = cloneGeneric(original); err != nil { 71 t.Fatal(err) 72 } 73 74 if exp, act := original, cloned; !reflect.DeepEqual(exp, act) { 75 t.Fatalf("Wrong cloned contents: %v != %v", act, exp) 76 } 77 78 target := cloned.(map[string]interface{}) 79 target = target["root"].(map[string]interface{}) 80 target = target["first"].(map[string]interface{}) 81 target["value1"] = 2 82 83 target = original.(map[string]interface{}) 84 target = target["root"].(map[string]interface{}) 85 target = target["first"].(map[string]interface{}) 86 if exp, act := float64(1), target["value1"].(float64); exp != act { 87 t.Errorf("Original value was mutated: %v != %v", act, exp) 88 } 89 } 90 91 func TestCloneGenericYAML(t *testing.T) { 92 var original interface{} = map[interface{}]interface{}{ 93 "root": map[interface{}]interface{}{ 94 "first": map[interface{}]interface{}{ 95 "value1": 1, 96 "value2": 1.2, 97 "value3": false, 98 "value4": "hello world", 99 }, 100 "second": []interface{}{ 101 1, 1.2, false, "hello world", 102 }, 103 }, 104 } 105 var cloned interface{} 106 var err error 107 108 if cloned, err = cloneGeneric(original); err != nil { 109 t.Fatal(err) 110 } 111 112 if exp, act := original, cloned; !reflect.DeepEqual(exp, act) { 113 t.Fatalf("Wrong cloned contents: %v != %v", act, exp) 114 } 115 116 target := cloned.(map[interface{}]interface{}) 117 target = target["root"].(map[interface{}]interface{}) 118 target = target["first"].(map[interface{}]interface{}) 119 target["value1"] = 2 120 121 target = original.(map[interface{}]interface{}) 122 target = target["root"].(map[interface{}]interface{}) 123 target = target["first"].(map[interface{}]interface{}) 124 if exp, act := 1, target["value1"].(int); exp != act { 125 t.Errorf("Original value was mutated: %v != %v", act, exp) 126 } 127 } 128 129 //------------------------------------------------------------------------------ 130 131 var benchResult float64 132 133 func BenchmarkCloneGeneric(b *testing.B) { 134 var generic, cloned interface{} 135 err := json.Unmarshal([]byte(`{ 136 "root":{ 137 "first":{ 138 "value1": 1, 139 "value2": 1.2, 140 "value3": false, 141 "value4": "hello world" 142 }, 143 "second": [ 144 1, 145 1.2, 146 false, 147 "hello world" 148 ] 149 } 150 }`), &generic) 151 if err != nil { 152 b.Fatal(err) 153 } 154 155 b.ReportAllocs() 156 b.ResetTimer() 157 for i := 0; i < b.N; i++ { 158 if cloned, err = cloneGeneric(generic); err != nil { 159 b.Fatal(err) 160 } 161 } 162 b.StopTimer() 163 164 target := cloned.(map[string]interface{}) 165 target = target["root"].(map[string]interface{}) 166 target = target["first"].(map[string]interface{}) 167 benchResult = target["value1"].(float64) 168 if exp, act := float64(1), benchResult; exp != act { 169 b.Errorf("Wrong result: %v != %v", act, exp) 170 } 171 } 172 173 func BenchmarkCloneJSON(b *testing.B) { 174 var generic, cloned interface{} 175 err := json.Unmarshal([]byte(`{ 176 "root":{ 177 "first":{ 178 "value1": 1, 179 "value2": 1.2, 180 "value3": false, 181 "value4": "hello world" 182 }, 183 "second": [ 184 1, 185 1.2, 186 false, 187 "hello world" 188 ] 189 } 190 }`), &generic) 191 if err != nil { 192 b.Fatal(err) 193 } 194 195 b.ReportAllocs() 196 b.ResetTimer() 197 for i := 0; i < b.N; i++ { 198 var interBytes []byte 199 if interBytes, err = json.Marshal(generic); err != nil { 200 b.Fatal(err) 201 } 202 if err = json.Unmarshal(interBytes, &cloned); err != nil { 203 b.Fatal(err) 204 } 205 } 206 b.StopTimer() 207 208 target := cloned.(map[string]interface{}) 209 target = target["root"].(map[string]interface{}) 210 target = target["first"].(map[string]interface{}) 211 benchResult = target["value1"].(float64) 212 if exp, act := float64(1), benchResult; exp != act { 213 b.Errorf("Wrong result: %v != %v", act, exp) 214 } 215 } 216 217 //------------------------------------------------------------------------------