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 }