gitlab.com/nikonor/eerrors@v1.0.0/ee_test.go (about)

     1  package eerrors
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  	"runtime"
     8  	"strconv"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  func begin() {
    15  	New(405, 405, "", "", 3)
    16  	New(111111, 501, "Текст для лога  #1", "Текст для пользователя #1", ERROR)
    17  	New(222222, 502, "Текст для лога  #2", "Текст для пользователя #2", ERROR)
    18  }
    19  
    20  func TestNew(t *testing.T) {
    21  	begin()
    22  	
    23  	_, ok := New(111111, 501, "Текст для лога  #1", "Текст для пользователя #1", 3)
    24  	if ok {
    25  		t.Error("Ошибка не могла создаться, но создалась")
    26  	}
    27  	_, ok = New(333333, 501, "Текст для лога  #1", "Текст для пользователя #1", 3)
    28  	if !ok {
    29  		t.Error("Ошибка д.б. создаться, но не создалась")
    30  	}
    31  }
    32  
    33  func TestError_IsEq(t *testing.T) {
    34  	fName := "ee_test.go"
    35  	fnName := "TestOne"
    36  	lp := LogPrefixType("6qyftytfd76")
    37  	
    38  	begin()
    39  	ee, _ := New(333, 503, "Текст для лога  #3", "Текст для пользователя #3", ERROR)
    40  	e := Decorate(333, fName, fnName).WithError(errors.New("new error #1")).WithPrefix(lp).WithStringNum(57)
    41  	if !ee.IsEq(*e) {
    42  		t.Error("неверно #1")
    43  	}
    44  	
    45  	e = Decorate(111111, fName, fnName).WithError(errors.New("new error #1")).WithPrefix(lp).WithStringNum(57)
    46  	if e.IsEq(*ee) {
    47  		t.Error("неверно #2")
    48  	}
    49  }
    50  
    51  func TestError_Is(t *testing.T) {
    52  	fName := "ee_test.go"
    53  	fnName := "TestError_Is"
    54  	lp := LogPrefixType("ejrlhejk111")
    55  	
    56  	begin()
    57  	ee, _ := New(333, 503, "Текст для лога  #3", "Текст для пользователя #3", ERROR)
    58  	e := Decorate(333, fName, fnName).WithError(errors.New("new error #1")).WithPrefix(lp).WithStringNum(57)
    59  	if !ee.IsEq(*e) {
    60  		t.Error("неверно #1 Message")
    61  	}
    62  	if !ee.Is(e) {
    63  		t.Error("неверно #1 *Message")
    64  	}
    65  	if !ee.Is(333) {
    66  		t.Error("неверно #1 int")
    67  	}
    68  	if !ee.Is(int64(333)) {
    69  		t.Error("неверно #1 int64")
    70  	}
    71  	
    72  	e = Decorate(111111, fName, fnName).WithError(errors.New("new error #2")).WithPrefix(lp).WithStringNum(57)
    73  	t.Logf("ee: %#v; e: %#v", ee, e)
    74  	if e.Is(*ee) {
    75  		t.Error("неверно #2 Message")
    76  	}
    77  	if e.Is(ee) {
    78  		t.Error("неверно #2 *Message")
    79  	}
    80  	if !e.Is(111111) {
    81  		t.Error("неверно #2 int")
    82  	}
    83  	if !e.Is(int64(111111)) {
    84  		t.Error("неверно #2 int64")
    85  	}
    86  }
    87  
    88  func TestOne(t *testing.T) {
    89  	begin()
    90  	
    91  	fName := "ee_test.go"
    92  	fnName := "TestOne"
    93  	lp := LogPrefixType("6qyftytfd76")
    94  	
    95  	println("НАЧАЛЬНОЕ СОЗДАНИЕ ОШИБКИ: " + `New(111111, 501, "Текст для лога  #1", "Текст для пользователя #1", ERROR)` + "\n")
    96  	// ПРИМЕР
    97  	e := Decorate(111111, fName, fnName)
    98  	// вывод ошибки в лог
    99  	println("ВЫЗОВ : ", `e := Decorate(111111, "ee_test.go", "TestOne")`)
   100  	println("В ЛОГЕ: ", e.Error(), "\n")
   101  	if !strings.Contains(e.Error(), `111111 Текст для лога  #1 @[ee_test.go:TestOne]`) {
   102  		t.Error("Ошибка #1")
   103  	}
   104  	
   105  	e = Decorate(111111, fName, fnName).WithError(errors.New("new error #1"))
   106  	println("ВЫЗОВ : ", `e := Decorate(111111, "ee_test.go", "TestOne").WithError(errors.New("new error #1"))`)
   107  	println("В ЛОГЕ: ", e.Error(), "\n")
   108  	if !strings.Contains(e.Error(), `111111 Текст для лога  #1 new error #1 @[ee_test.go:TestOne]`) {
   109  		t.Error("Ошибка #2", e.Error())
   110  	}
   111  	
   112  	e = Decorate(111111, fName, fnName).WithError(errors.New("new error #1")).WithPrefix(lp)
   113  	println("ВЫЗОВ : ", `e := Decorate(111111, "ee_test.go", "TestOne").WithError(errors.New("new error #1")).WithPrefix(lp)`)
   114  	println("В ЛОГЕ: ", e.Error(), "\n")
   115  	if !strings.Contains(e.Error(), `6qyftytfd76 ERROR 111111 Текст для лога  #1 new error #1 @[ee_test.go:TestOne]`) {
   116  		t.Error("Ошибка #3", e.Error())
   117  	}
   118  	
   119  	e = Decorate(111111, fName, fnName).WithError(errors.New("new error #1")).WithPrefix(lp).WithStringNum(57)
   120  	println("ВЫЗОВ : ", `e := Decorate(111111, "ee_test.go", "TestOne").WithError(errors.New("new error #1")).WithPrefix(lp).WithStringNum(57)`)
   121  	println("В ЛОГЕ: ", e.Error(), "\n")
   122  	if !strings.Contains(e.Error(), `6qyftytfd76 ERROR 111111 Текст для лога  #1 new error #1 @[ee_test.go:TestOne:57]`) {
   123  		t.Error("Ошибка #4", e.Error())
   124  	}
   125  	
   126  	// вывод ошибки для пользователя
   127  	println("REST:   ", string(e.JSON()))
   128  	if string(e.JSON()) != `{"errorCode":501,"errorMessage":"Текст для пользователя #1"}` {
   129  		t.Error("Ошибка #5", string(e.JSON()), " != ", "{\"errorCode\":501,\"errorMessage\":\"Текст для пользователя #1\"}")
   130  	}
   131  }
   132  
   133  func TestGetNow(t *testing.T) {
   134  	for i := 0; i < 10000; i++ {
   135  		tt := time.Now()
   136  		s := getTimeString(tt)
   137  		// формат: 2022-02-10T12:45:10.234548+03:00
   138  		if len(s) != 32 {
   139  			t.Errorf("wrong: %s (%d)\n", s, len(s))
   140  		}
   141  	}
   142  }
   143  
   144  func TestMustGet(t *testing.T) {
   145  	lp := LogPrefixType("jy7fdnifheq145")
   146  	if _, ok := New(444, 0, "Текст для дебага", "", DEBUG); !ok {
   147  		t.Error("TestGet не получилось создать новую ошибку")
   148  	}
   149  	
   150  	d, ok := MustGet(444)
   151  	if !ok {
   152  		t.Error("TestGet не нашли созданную ошибку")
   153  	}
   154  	d.WithPrefix(lp).WithMessage("что-то выводим", 22, 22.222).WOCode().WithAt("ee_test", "TestGet")
   155  	fmt.Printf("Debug: %s\n", d)
   156  	
   157  	d, ok = MustGet(555)
   158  	if ok || d != nil {
   159  		t.Error("Нашли ошибку которой быть не должно")
   160  	}
   161  }
   162  
   163  func TestGet(t *testing.T) {
   164  	lp := LogPrefixType("jy7fdnifheq145")
   165  	if _, ok := New(4444, 0, "Текст для дебага", "", DEBUG); !ok {
   166  		t.Error("TestGet не получилось создать новую ошибку")
   167  	}
   168  	
   169  	d := Get(4444).WithPrefix(lp).WithMessage("что-то выводим", 22, 22.222).WOCode().WithAt("ee_test", "TestGet")
   170  	fmt.Printf("Debug: %s\n", d)
   171  }
   172  
   173  func TestDebug(t *testing.T) {
   174  	lp := LogPrefixType("fhdjkfs6t6fe")
   175  	d := Get(0).WithMessage("что-то выводим", 22, 22.222)
   176  	fmt.Printf("%s\n", d)
   177  	d = Get(0).WithMessage("что-то выводим", 22, 22.222).WithPrefix(lp)
   178  	fmt.Printf("%s\n", d)
   179  	d = Get(0).WithMessage("что-то выводим", 22, 22.222).WithPrefix(lp).WithAt("ee_test", "TestDebug")
   180  	fmt.Printf("%s\n", d)
   181  }
   182  
   183  func TestMessage_WOTime(t *testing.T) {
   184  	begin()
   185  	lp := LogPrefixType("fhdjkfs6t6fe")
   186  	e := Get(111111)
   187  	fmt.Printf("wotime=%s\n", e)
   188  	
   189  	e = e.WOTime()
   190  	fmt.Printf("wotime=%s\n", e)
   191  	
   192  	e = e.WithPrefix(lp)
   193  	fmt.Printf("wotime=%s\n", e)
   194  	
   195  	e = e.WOCode()
   196  	fmt.Printf("wotime=%s\n", e)
   197  	
   198  	if strings.Contains(e.String(), "[") {
   199  		t.Error("время не удалилось")
   200  	}
   201  }
   202  
   203  func TestSetModuleName(t *testing.T) {
   204  	begin()
   205  	mName := "testModule"
   206  	
   207  	e := Get(111111)
   208  	fmt.Printf("before=%s\n", e)
   209  	if strings.Contains(e.String(), mName) {
   210  		t.Error("ошибка #1")
   211  	}
   212  	
   213  	SetModuleName(mName)
   214  	
   215  	e = Get(111111)
   216  	fmt.Printf("after=%s\n", e)
   217  	if !strings.Contains(e.String(), mName) {
   218  		t.Error("ошибка #2")
   219  	}
   220  	
   221  	e = Get(111111).WOModuleName()
   222  	fmt.Printf("after=%s\n", e)
   223  	if strings.Contains(e.String(), mName) {
   224  		t.Error("ошибка #3")
   225  	}
   226  }
   227  
   228  func TestMessage_Sprintf(t *testing.T) {
   229  	New(1, 0, "Строка=%s, число=%d", "", 3)
   230  	e := Get(1).Sprintf("aaa", 22)
   231  	if !strings.Contains(e.String(), "Строка=aaa, число=22") {
   232  		t.Errorf("не работает Sprintf:\n\tждали: Строка=aaa, число=22\n\tполучили=%s", e.String())
   233  	}
   234  }
   235  
   236  func TestMessage_SprintfPriv(t *testing.T) {
   237  	New(1777, 0, "Строка=%s, число=%d", "публичная ошибка", 3)
   238  	e := Get(1777).SprintfPriv("aaa", 22)
   239  	if !strings.Contains(e.String(), "Строка=aaa, число=22") {
   240  		t.Errorf("не работает SprintfPriv:\n\tждали: Строка=aaa, число=22\n\tполучили=%s", e.String())
   241  	}
   242  	
   243  	if e.publicMessage != "публичная ошибка" {
   244  		t.Errorf("не работает SprintfPriv:\n\tждали строку \"публичная ошибка\" \n\tа получили :: %s", e.publicMessage)
   245  	}
   246  }
   247  
   248  func TestBG(t *testing.T) {
   249  	for i := 0; i <= 100; i++ {
   250  		e := Debug().WithMessage("i=", strconv.Itoa(i+1))
   251  		println(e.Error())
   252  	}
   253  }
   254  
   255  func TestMessage_PublicError(t *testing.T) {
   256  	begin()
   257  	
   258  	e := Get(111111)
   259  	ec, em := e.PublicError()
   260  	fmt.Printf("ec=%d em=\"%s\"\n", ec, em)
   261  	if !strings.Contains(em, "111111") {
   262  		t.Error("Не добавился код")
   263  	}
   264  	
   265  	e = Error()
   266  	ec, em = e.PublicError()
   267  	fmt.Printf("ec=%d em=\"%s\"\n", ec, em)
   268  	if len(em) > 0 {
   269  		t.Error("Ошибка #2")
   270  	}
   271  }
   272  
   273  func TestMessage_PrivateError(t *testing.T) {
   274  	begin()
   275  	
   276  	// Тест если не заполнено поле PrivateError
   277  	e := Get(405)
   278  	ec, em := e.PrivateError()
   279  	fmt.Printf("ec=%d em=\"%s\"\n", ec, em)
   280  	
   281  	e = Get(405).WithMessage(`Message for error
   282  {
   283      "one":1,
   284      "two": 2
   285  }
   286      `)
   287  	ec, em = e.PrivateError()
   288  	fmt.Printf("ec=%d em=\"%s\"\n", ec, em)
   289  	
   290  	e = Error().WithMessage("Message #2 for error").WithError(errors.New("this is error text"))
   291  	ec, em = e.PrivateError()
   292  	fmt.Printf("==>1::ec=%d em=\"%s\"\n", ec, em)
   293  	ec, em = e.PrivateErrorWithErr()
   294  	fmt.Printf("==>2::ec=%d em=\"%s\"\n", ec, em)
   295  	
   296  	e, _ = New(100, 2000, "private", "public", NOTICE)
   297  	ec, em = e.PublicError()
   298  	_, em = e.PrivateErrorWithErr()
   299  	fmt.Printf("3::ec=%d em=\"%s\"\n", ec, em)
   300  }
   301  
   302  // func BenchmarkPrepare(b *testing.B) {
   303  // 	for i := 0; i < b.N; i++ {
   304  // 		eerr := Error().WithPrefix(LogPrefixType("LP")).WithAt("ee_test.go", "BenchmarkPrepare").WithMessage("Это проверка #", 1)
   305  // 		eerr.prepareOld()
   306  // 	}
   307  // }
   308  //
   309  // func BenchmarkPrepareBuilder(b *testing.B) {
   310  // 	for i := 0; i < b.N; i++ {
   311  // 		eerr := Error().WithPrefix(LogPrefixType("LP")).WithAt("ee_test.go", "BenchmarkPrepare").WithMessage("Это проверка #", 1)
   312  // 		eerr.prepare()
   313  // 	}
   314  // }
   315  
   316  func TestLogLevel(t *testing.T) {
   317  	logPrefix := NewPrefix()
   318  	d := Debug().WithPrefix(logPrefix).WithMessage("Debug").prepare()
   319  	e := Error().WithPrefix(logPrefix).WithMessage("Error").prepare()
   320  	if len(d) == 0 || len(e) == 0 {
   321  		t.Errorf("Ошибка #1:\n\td=%s\n\te=%s\n", d, e)
   322  	}
   323  	SetCurLogLevel(3)
   324  	d = Debug().WithPrefix(logPrefix).WithMessage("Debug").prepare()
   325  	e = Error().WithPrefix(logPrefix).WithMessage("Error").prepare()
   326  	if len(d) != 0 || len(e) == 0 {
   327  		t.Errorf("Ошибка #2:\n\td=%s\n\te=%s\n", d, e)
   328  	}
   329  	SetCurLogLevel(1)
   330  	d = Debug().WithPrefix(logPrefix).WithMessage("Debug").prepare()
   331  	e = Error().WithPrefix(logPrefix).WithMessage("Error").prepare()
   332  	if len(d) != 0 || len(e) != 0 {
   333  		t.Errorf("Ошибка #2:\n\td=%s\n\te=%s\n", d, e)
   334  	}
   335  }
   336  
   337  func TestSetLevel(t *testing.T) {
   338  	logPrefix := NewPrefix()
   339  	d := Debug().WithPrefix(logPrefix).WithMessage("Debug")
   340  	if d.level != 7 {
   341  		t.Error("ошибка инициализации")
   342  	}
   343  	d = d.SetLevel(ERROR)
   344  	if d.level != 3 {
   345  		t.Error("ошибка смены уровня #1")
   346  	}
   347  	
   348  	d = d.SetLevel(WARNING)
   349  	if d.level != 4 {
   350  		t.Error("ошибка смены уровня #2")
   351  	}
   352  }
   353  
   354  func TestMaskedWords(t *testing.T) {
   355  	var (
   356  		maskPrivate = "mask_private"
   357  		maskPublic  = "mask_public"
   358  		maskMessage = "mask_message"
   359  		maskError   = "mask_error"
   360  	)
   361  	
   362  	SetCurLogLevel(ERROR)
   363  	maskedWords := []string{maskPrivate, maskMessage, maskError, maskPublic}
   364  	
   365  	var (
   366  		e    *Message
   367  		ok   bool
   368  		code = 77077
   369  	)
   370  	
   371  	if e, ok = New(code, 7, maskPrivate, maskPublic, ERROR); !ok {
   372  		t.Error("не создалась переменная типа Message")
   373  	}
   374  	
   375  	e = e.MaskWords(maskedWords).WithError(errors.New(maskError)).WithMessage(maskMessage)
   376  	
   377  	if e.message == nil {
   378  		t.Error("ошибка при вызове WithMessage")
   379  	}
   380  	
   381  	// проверяем добавление
   382  	if len(maskedWords) != len(e.maskedWords) {
   383  		t.Error("ошибка добавления слов для маскирования")
   384  	}
   385  	
   386  	// проверяем маскирование
   387  	e.prepare()
   388  	
   389  	if e.result == nil {
   390  		t.Error("ошибка при prepare, result = nil")
   391  	}
   392  	
   393  	if strings.Contains(*e.result, maskMessage) || strings.Contains(*e.result, maskPrivate) || strings.Contains(*e.result, maskError) {
   394  		t.Errorf("ошибка маскирования слов, e.result :: \n%s\n", *e.result)
   395  	}
   396  	
   397  	// проверяем функцию PublicError()
   398  	_, mes := e.PublicError()
   399  	
   400  	if strings.Contains(mes, maskPublic) {
   401  		t.Errorf("ошибка маскирования слов, PublicMessage :: \n%s\n", mes)
   402  	}
   403  }
   404  
   405  func TestTime(t *testing.T) {
   406  	var a []*Message
   407  	for i := 1; i <= 10; i++ {
   408  		a = append(a, Debug().WithMessage("idx="+strconv.Itoa(i)))
   409  		time.Sleep(time.Second / 2)
   410  	}
   411  	fmt.Printf("a=%#v\n", a)
   412  }
   413  
   414  func TestNewStringPrefix(t *testing.T) {
   415  	str := "newprefix"
   416  	lp := NewStringPrefix(str)
   417  	if str != lp.String() {
   418  		t.Errorf("%+v != %+v", str, lp.String())
   419  	}
   420  }
   421  
   422  func TestAddStringPrefix(t *testing.T) {
   423  	str := "customstr"
   424  	lp := NewStringPrefix("newprefix")
   425  	logPrefix := AddStringPrefix(lp, str)
   426  	if "newprefix"+"::"+str != logPrefix.String() {
   427  		t.Errorf("%+v != %+v", "newprefix"+"::"+str, logPrefix.String())
   428  	}
   429  }
   430  
   431  func TestGetPrivf(t *testing.T) {
   432  	_, _ = New(999991, 999991, "format me with %s", "but no me", 3)
   433  	eerr := GetPrivf(999991, "text")
   434  	if eerr.privateMessage != "format me with text" {
   435  		t.Errorf("%+v != %+v", "format me with text", eerr.privateMessage)
   436  	}
   437  	if eerr.publicMessage != "but no me" {
   438  		t.Errorf("%+v != %+v", "but no me", eerr.publicMessage)
   439  	}
   440  }
   441  
   442  func TestGetf(t *testing.T) {
   443  	_, _ = New(999999, 999999, "format me with %s", "and me to: %s", 3)
   444  	eerr := Getf(999999, "text")
   445  	if eerr.privateMessage != "format me with text" {
   446  		t.Errorf("%+v != %+v", eerr.privateMessage, "format me with text")
   447  	}
   448  	if eerr.publicMessage != "and me to: text" {
   449  		t.Errorf("%+v != %+v", eerr.publicMessage, "and me to: text")
   450  	}
   451  }
   452  
   453  func TestPublicError3(t *testing.T) {
   454  	errText := "это тестовая ошибка"
   455  	err := errors.New(errText)
   456  	e, _ := New(501000, 501, "приват", "паблик", 3)
   457  	
   458  	ec, em := PublicError(err)
   459  	if ec != 500 || em != errText {
   460  		t.Errorf("Ошибка #1: ec=%d, em=!%s!\n", ec, em)
   461  	}
   462  	
   463  	ec, em = PrivateError(err)
   464  	if ec != 500 || em != errText {
   465  		t.Errorf("Ошибка #2: ec=%d, em=!%s!\n", ec, em)
   466  	}
   467  	
   468  	ec, em = e.PublicError()
   469  	if ec != 501 || !strings.HasPrefix(em, "паблик") {
   470  		t.Errorf("Ошибка #3: ec=%d, em=!%s!\n", ec, em)
   471  	}
   472  	
   473  	ec, em = e.PrivateError()
   474  	if ec != 501000 || em != "приват" {
   475  		t.Errorf("Ошибка #4: ec=%d, em=!%s!\n", ec, em)
   476  	}
   477  }
   478  
   479  func TestName(t *testing.T) {
   480  	lp := NewPrefix()
   481  	var stat runtime.MemStats
   482  	for j := 0; j < 10; j++ {
   483  		for i := 0; i < 1_000; i++ {
   484  			e := Get(-7)
   485  			e = e.WithPrefix(lp)
   486  			e.maskedWords = nil
   487  			e = nil
   488  		}
   489  		runtime.ReadMemStats(&stat)
   490  		fmt.Printf("%d::%d\n", j, stat.HeapInuse)
   491  	}
   492  	runtime.ReadMemStats(&stat)
   493  	fmt.Printf("last::%d\n", stat.HeapInuse)
   494  }
   495  
   496  func TestGetMessage(t *testing.T) {
   497  	msg := "test message"
   498  	e := Debug().WithMessage(msg).WithMessage(msg)
   499  	
   500  	msgNew := e.GetMessage()
   501  	
   502  	if msg != msgNew {
   503  		t.Errorf("Ошибка #1: msg=%s, msgNew=%s\n", msg, msgNew)
   504  	}
   505  }
   506  
   507  func TestName2(t *testing.T) {
   508  	var stat runtime.MemStats
   509  	for j := 0; j < 10; j++ {
   510  		for i := 0; i < 1_000; i++ {
   511  			e := &Message{}
   512  			e.level = 7
   513  			e = nil
   514  		}
   515  		runtime.ReadMemStats(&stat)
   516  		fmt.Printf("%d::%d\n", j, stat.HeapInuse)
   517  	}
   518  	runtime.GC()
   519  	runtime.ReadMemStats(&stat)
   520  	fmt.Printf("last::%d\n", stat.HeapInuse)
   521  }
   522  
   523  func BenchmarkLL1(b *testing.B) {
   524  	for i := 0; i < b.N; i++ {
   525  		e := Debug().WithMessage("qwe")
   526  		e.MaskWords([]string{"qwe"})
   527  		e = nil
   528  	}
   529  }
   530  func BenchmarkLL2(b *testing.B) {
   531  	var e *Message
   532  	for i := 0; i < b.N; i++ {
   533  		e = Debug().WithMessage("qwe")
   534  		e.MaskWords([]string{"qwe"})
   535  	}
   536  }
   537  
   538  func BenchmarkLL3(b *testing.B) {
   539  	var stat runtime.MemStats
   540  	for i := 0; i < b.N; i++ {
   541  		e := Debug().WithMessage("qwe")
   542  		e.level = 3
   543  		e.maskedWords = nil
   544  		e = nil
   545  		if i%10_000 == 0 {
   546  			runtime.ReadMemStats(&stat)
   547  			fmt.Printf("%010d::%d\n", i, stat.HeapInuse)
   548  		}
   549  	}
   550  	// runtime.GC()
   551  	// time.Sleep(3 * time.Second)
   552  	runtime.ReadMemStats(&stat)
   553  	fmt.Printf("%010d::%d\n", 999, stat.HeapInuse)
   554  }
   555  func BenchmarkLL4(b *testing.B) {
   556  	var stat runtime.MemStats
   557  	for i := 0; i < b.N; i++ {
   558  		e := Debug().WithMessage("qwe")
   559  		e.level = 3
   560  		// e.maskedWords = nil
   561  		// e = nil
   562  		if i%1000 == 0 {
   563  			runtime.ReadMemStats(&stat)
   564  			fmt.Printf("%05d::%d\n", i, stat.HeapInuse)
   565  		}
   566  	}
   567  	// runtime.GC()
   568  	// time.Sleep(3 * time.Second)
   569  	// runtime.ReadMemStats(&stat)
   570  	// fmt.Printf("%05d::%d\n", 999, stat.HeapInuse)
   571  }
   572  
   573  func BenchmarkBytesBufWithReset(b *testing.B) {
   574  	var stat runtime.MemStats
   575  	for i := 0; i < 100; i++ {
   576  		bb := bytes.NewBuffer([]byte("qwerty"))
   577  		bb.WriteString("ASD")
   578  		bb.Reset()
   579  		if i%10 == 0 {
   580  			runtime.ReadMemStats(&stat)
   581  			fmt.Printf("%05d::%d\n", i, stat.HeapInuse)
   582  		}
   583  	}
   584  }
   585  func BenchmarkBytesBufWOReset(b *testing.B) {
   586  	var stat runtime.MemStats
   587  	for i := 0; i < 100; i++ {
   588  		bb := bytes.NewBuffer([]byte("qwerty"))
   589  		bb.WriteString("ASD")
   590  		// bb.Reset()
   591  		if i%10 == 0 {
   592  			runtime.ReadMemStats(&stat)
   593  			fmt.Printf("%05d::%d\n", i, stat.HeapInuse)
   594  		}
   595  	}
   596  }
   597  
   598  func BenchmarkStringVSBuilder1(b *testing.B) {
   599  	for i := 0; i < b.N; i++ {
   600  		a := "qwe"
   601  		a += "asd"
   602  	}
   603  }
   604  func BenchmarkStringVSBuilder2(b *testing.B) {
   605  	var a strings.Builder
   606  	for i := 0; i < b.N; i++ {
   607  		a.WriteString("qwe")
   608  		a.WriteString("asd")
   609  	}
   610  }
   611  func BenchmarkStringVSBuilder3(b *testing.B) {
   612  	var a strings.Builder
   613  	for i := 0; i < b.N; i++ {
   614  		a.WriteString("qwe")
   615  		a.WriteString("asd")
   616  		a.Reset()
   617  	}
   618  }
   619  
   620  func TestMessage_GetError(t *testing.T) {
   621  	type fields struct {
   622  		pc int
   623  		e  error
   624  	}
   625  	e := errors.New("not nil error")
   626  	tests := []struct {
   627  		name    string
   628  		fields  fields
   629  		wantErr error
   630  	}{
   631  		{name: "nil", fields: fields{pc: 1, e: nil}, wantErr: nil},
   632  		{name: "not nil", fields: fields{pc: 2, e: e}, wantErr: e},
   633  	}
   634  	for _, tt := range tests {
   635  		t.Run(tt.name, func(t *testing.T) {
   636  			got := (&Message{privateCode: tt.fields.pc}).WithError(tt.fields.e).GetError()
   637  			if (tt.wantErr != nil) && !errors.Is(got, tt.wantErr) {
   638  				t.Errorf("GetError() error = %v, wantErr %v", got, tt.wantErr)
   639  			}
   640  		})
   641  	}
   642  }