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 }