github.com/GuanceCloud/cliutils@v1.1.21/point/rand_test.go (about)

     1  // Unless explicitly stated otherwise all files in this repository are licensed
     2  // under the MIT License.
     3  // This product includes software developed at Guance Cloud (https://www.guance.com/).
     4  // Copyright 2021-present Guance, Inc.
     5  
     6  package point
     7  
     8  import (
     9  	"sort"
    10  	"strings"
    11  	T "testing"
    12  	"time"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestPointRander(t *T.T) {
    19  	t.Run("rand-1", func(t *T.T) {
    20  		r := NewRander()
    21  		pts := r.Rand(1)
    22  
    23  		require.Equal(t, 1, len(pts))
    24  
    25  		pt := pts[0]
    26  		fs := pt.Fields()
    27  		require.True(t, len(fs) > 0)
    28  
    29  		tags := pt.Tags()
    30  
    31  		require.Equal(t, defFields, len(fs))
    32  		require.Equal(t, defTags, len(tags))
    33  
    34  		for _, tag := range tags {
    35  			require.Equal(t, defKeyLen, len(tag.Key))
    36  			require.Equal(t, defValLen, len(tag.GetS()))
    37  		}
    38  
    39  		for _, f := range fs {
    40  			require.Equal(t, defKeyLen, len(f.Key))
    41  
    42  			switch x := f.Val.(type) {
    43  			case *Field_D:
    44  				require.Equal(t, defValLen, len(x.D))
    45  			default: // skip
    46  			}
    47  		}
    48  
    49  		t.Logf("point: %s", pts[0].Pretty())
    50  	})
    51  
    52  	t.Run("with-measurement-prefix", func(t *T.T) {
    53  		r := NewRander(WithRandMeasurementPrefix("abc_"))
    54  		pts := r.Rand(1)
    55  		require.True(t, strings.HasPrefix(pts[0].Name(), "abc_"))
    56  
    57  		t.Logf("point: %s", pts[0].Pretty())
    58  	})
    59  
    60  	t.Run("with-pb", func(t *T.T) {
    61  		r := NewRander(WithRandPB(true))
    62  		pts := r.Rand(1)
    63  		require.True(t, pts[0].HasFlag(Ppb))
    64  
    65  		t.Logf("point: %s", pts[0].Pretty())
    66  	})
    67  
    68  	t.Run("with-time", func(t *T.T) {
    69  		ts := time.Unix(0, 123)
    70  		r := NewRander(WithRandTime(ts))
    71  
    72  		pts := r.Rand(1)
    73  		require.Equal(t, ts.UnixNano(), pts[0].Time().UnixNano())
    74  		t.Logf("point: %s", pts[0].Pretty())
    75  	})
    76  
    77  	t.Run("with-text", func(t *T.T) {
    78  		r := NewRander(WithRandText(4))
    79  
    80  		pts := r.Rand(1)
    81  		fs := pts[0].Fields()
    82  		require.True(t, len(fs) > 0)
    83  
    84  		ntext := 0
    85  		for _, f := range fs {
    86  			if strings.HasPrefix(f.Key, "long-text") {
    87  				ntext++
    88  			}
    89  		}
    90  
    91  		require.Equal(t, 4, ntext)
    92  
    93  		t.Logf("point: %s", pts[0].Pretty())
    94  	})
    95  
    96  	t.Run("with-tags", func(t *T.T) {
    97  		r := NewRander(WithRandTags(100))
    98  
    99  		pts := r.Rand(1)
   100  
   101  		require.Equal(t, 100, len(pts[0].Tags()))
   102  
   103  		t.Logf("point: %s", pts[0].Pretty())
   104  	})
   105  
   106  	t.Run("with-fields", func(t *T.T) {
   107  		r := NewRander(WithRandFields(100))
   108  
   109  		pts := r.Rand(1)
   110  
   111  		fs := pts[0].Fields()
   112  		require.True(t, len(fs) > 0)
   113  
   114  		require.Equal(t, 100, len(fs))
   115  
   116  		t.Logf("point: %s", pts[0].Pretty())
   117  	})
   118  
   119  	t.Run("with-key-val-len", func(t *T.T) {
   120  		klen := 751 % defaultKeyLen // can't exceed default point key len
   121  		vlen := 157
   122  		r := NewRander(WithRandKeyLen(klen), WithRandValLen(vlen))
   123  
   124  		pts := r.Rand(1)
   125  
   126  		fs := pts[0].Fields()
   127  		require.True(t, len(fs) > 0)
   128  
   129  		tags := pts[0].Tags()
   130  
   131  		for _, f := range fs {
   132  			require.Equal(t, klen, len(f.Key))
   133  			if x, ok := f.Val.(*Field_D); ok {
   134  				require.Equal(t, vlen, len(x.D))
   135  			}
   136  		}
   137  
   138  		for _, tag := range tags {
   139  			require.Equal(t, klen, len(tag.Key))
   140  			require.Equal(t, vlen, len(tag.GetS()))
   141  		}
   142  	})
   143  }
   144  
   145  func TestWithFixTags(t *T.T) {
   146  	t.Run("with-fix-tags", func(t *T.T) {
   147  		r := NewRander(WithFixedTags(true))
   148  
   149  		pt1 := r.Rand(1)[0]
   150  		pt2 := r.Rand(1)[0]
   151  
   152  		t.Logf("tag keys: %v", r.tagKeys)
   153  		t.Logf("tag vals: %v", r.tagVals)
   154  
   155  		pt1tags := pt1.Tags()
   156  		pt2tags := pt2.Tags()
   157  		for idx, tag := range pt1tags {
   158  			require.Equal(t, pt2tags[idx].Key, tag.Key, "%d not equal:\npt1: %s\n\npt2: %s", idx, pt1.Pretty(), pt2.Pretty())
   159  			require.Equal(t, pt2tags[idx].Val, tag.Val)
   160  		}
   161  	})
   162  }
   163  
   164  func TestWithFixKeys(t *T.T) {
   165  	t.Run("with-fix-keys", func(t *T.T) {
   166  		r := NewRander(WithFixedKeys(true))
   167  
   168  		require.Equal(t, r.getFieldKey(0), r.getFieldKey(0))
   169  		require.NotEqual(t, r.getFieldKey(2), r.getFieldKey(3))
   170  
   171  		pt1 := r.Rand(1)[0]
   172  		pt2 := r.Rand(1)[0]
   173  
   174  		// NOTE: sort kvs to keep assert ok
   175  		sort.Sort(KVs(pt1.pt.Fields))
   176  		sort.Sort(KVs(pt2.pt.Fields))
   177  
   178  		pt1tags := pt1.Tags()
   179  		pt2tags := pt2.Tags()
   180  		for idx, tag := range pt1tags {
   181  			assert.Equal(t, pt2tags[idx].Key, tag.Key)
   182  		}
   183  
   184  		pt1fs := pt1.Fields()
   185  		pt2fs := pt2.Fields()
   186  		t.Logf("field keys: %v", r.fieldKeys)
   187  		for idx, f := range pt1fs {
   188  			require.Equal(t,
   189  				pt2fs[idx].Key,
   190  				f.Key,
   191  				"%d not equal:\npt1: %s\n\npt2: %s",
   192  				idx,
   193  				KVs(pt1.pt.Fields).Pretty(),
   194  				KVs(pt2.pt.Fields).Pretty())
   195  		}
   196  	})
   197  }
   198  
   199  func BenchmarkRandWithPool(b *T.B) {
   200  	b.Run("with-pool-v3", func(b *T.B) {
   201  		pp := NewReservedCapPointPool(1000)
   202  		SetPointPool(pp)
   203  
   204  		b.Cleanup(func() {
   205  			ClearPointPool()
   206  		})
   207  
   208  		r := NewRander(WithFixedKeys(true), WithFixedTags(true), WithRandStringValues(false))
   209  
   210  		for i := 0; i < b.N; i++ {
   211  			pts := r.Rand(1000)
   212  			for _, pt := range pts {
   213  				pp.Put(pt)
   214  			}
   215  		}
   216  	})
   217  
   218  	b.Run("with-reserved-pool", func(b *T.B) {
   219  		pp := NewReservedCapPointPool(128)
   220  		SetPointPool(pp)
   221  
   222  		b.Cleanup(func() {
   223  			ClearPointPool()
   224  		})
   225  		r := NewRander(WithFixedKeys(true), WithFixedTags(true), WithRandStringValues(false))
   226  
   227  		for i := 0; i < b.N; i++ {
   228  			pts := r.Rand(1000)
   229  			for _, pt := range pts {
   230  				pp.Put(pt)
   231  			}
   232  		}
   233  	})
   234  }
   235  
   236  func BenchmarkRandWithoutPool(b *T.B) {
   237  	b.Run("without-pool", func(b *T.B) {
   238  		r := NewRander(WithFixedKeys(true), WithFixedTags(true), WithRandStringValues(false))
   239  
   240  		for i := 0; i < b.N; i++ {
   241  			r.Rand(1000)
   242  		}
   243  	})
   244  }