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  //------------------------------------------------------------------------------