github.com/kubewharf/katalyst-core@v0.5.3/pkg/util/cgroup/manager/v2/fs_linux_test.go (about) 1 //go:build linux 2 // +build linux 3 4 /* 5 Copyright 2022 The Katalyst Authors. 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 */ 19 20 package v2 21 22 import ( 23 "reflect" 24 "testing" 25 26 "github.com/kubewharf/katalyst-core/pkg/util/cgroup/common" 27 ) 28 29 func TestNewManager(t *testing.T) { 30 t.Parallel() 31 32 tests := []struct { 33 name string 34 want *manager 35 }{ 36 { 37 name: "test new manager", 38 want: &manager{}, 39 }, 40 } 41 for _, tt := range tests { 42 tt := tt 43 t.Run(tt.name, func(t *testing.T) { 44 t.Parallel() 45 46 if got := NewManager(); !reflect.DeepEqual(got, tt.want) { 47 t.Errorf("NewManager() = %v, want %v", got, tt.want) 48 } 49 }) 50 } 51 } 52 53 func Test_manager_ApplyMemory(t *testing.T) { 54 t.Parallel() 55 56 type args struct { 57 absCgroupPath string 58 data *common.MemoryData 59 } 60 tests := []struct { 61 name string 62 m *manager 63 args args 64 wantErr bool 65 }{ 66 { 67 name: "test apply memory with LimitInBytes", 68 m: NewManager(), 69 args: args{ 70 absCgroupPath: "test-fake-path", 71 data: &common.MemoryData{ 72 LimitInBytes: 1234, 73 }, 74 }, 75 wantErr: true, 76 }, 77 { 78 name: "test apply memory with SoftLimitInBytes", 79 m: NewManager(), 80 args: args{ 81 absCgroupPath: "test-fake-path", 82 data: &common.MemoryData{ 83 SoftLimitInBytes: 2234, 84 }, 85 }, 86 wantErr: true, 87 }, 88 { 89 name: "test apply memory with MinInBytes", 90 m: NewManager(), 91 args: args{ 92 absCgroupPath: "test-fake-path", 93 data: &common.MemoryData{ 94 MinInBytes: 3234, 95 }, 96 }, 97 wantErr: true, 98 }, 99 } 100 for _, tt := range tests { 101 tt := tt 102 t.Run(tt.name, func(t *testing.T) { 103 t.Parallel() 104 m := &manager{} 105 if err := m.ApplyMemory(tt.args.absCgroupPath, tt.args.data); (err != nil) != tt.wantErr { 106 t.Errorf("manager.ApplyMemory() error = %v, wantErr %v", err, tt.wantErr) 107 } 108 }) 109 } 110 } 111 112 func Test_manager_ApplyCPU(t *testing.T) { 113 t.Parallel() 114 115 type args struct { 116 absCgroupPath string 117 data *common.CPUData 118 } 119 tests := []struct { 120 name string 121 m *manager 122 args args 123 wantErr bool 124 }{ 125 { 126 name: "test apply cpu", 127 m: NewManager(), 128 args: args{ 129 absCgroupPath: "test-fake-path", 130 data: &common.CPUData{ 131 Shares: 1024, 132 }, 133 }, 134 wantErr: true, 135 }, 136 } 137 for _, tt := range tests { 138 tt := tt 139 t.Run(tt.name, func(t *testing.T) { 140 t.Parallel() 141 142 m := &manager{} 143 if err := m.ApplyCPU(tt.args.absCgroupPath, tt.args.data); (err != nil) != tt.wantErr { 144 t.Errorf("manager.ApplyCPU() error = %v, wantErr %v", err, tt.wantErr) 145 } 146 }) 147 } 148 } 149 150 func Test_manager_ApplyCPUSet(t *testing.T) { 151 t.Parallel() 152 153 type args struct { 154 absCgroupPath string 155 data *common.CPUSetData 156 } 157 tests := []struct { 158 name string 159 m *manager 160 args args 161 wantErr bool 162 }{ 163 { 164 name: "test apply cpuset", 165 m: NewManager(), 166 args: args{ 167 absCgroupPath: "test-fake-path", 168 data: &common.CPUSetData{ 169 CPUs: "0-1", 170 }, 171 }, 172 wantErr: true, 173 }, 174 } 175 for _, tt := range tests { 176 tt := tt 177 t.Run(tt.name, func(t *testing.T) { 178 t.Parallel() 179 180 m := &manager{} 181 if err := m.ApplyCPUSet(tt.args.absCgroupPath, tt.args.data); (err != nil) != tt.wantErr { 182 t.Errorf("manager.ApplyCPUSet() error = %v, wantErr %v", err, tt.wantErr) 183 } 184 }) 185 } 186 } 187 188 func Test_manager_ApplyNetCls(t *testing.T) { 189 t.Parallel() 190 191 type args struct { 192 in0 string 193 in1 *common.NetClsData 194 } 195 tests := []struct { 196 name string 197 m *manager 198 args args 199 wantErr bool 200 }{ 201 { 202 name: "test apply netcls", 203 m: NewManager(), 204 args: args{ 205 in1: &common.NetClsData{ 206 ClassID: 5, 207 }, 208 }, 209 wantErr: true, 210 }, 211 } 212 for _, tt := range tests { 213 tt := tt 214 t.Run(tt.name, func(t *testing.T) { 215 t.Parallel() 216 217 m := &manager{} 218 if err := m.ApplyNetCls(tt.args.in0, tt.args.in1); (err != nil) != tt.wantErr { 219 t.Errorf("manager.ApplyNetCls() error = %v, wantErr %v", err, tt.wantErr) 220 } 221 }) 222 } 223 } 224 225 func Test_manager_ApplyIOCostQoS(t *testing.T) { 226 t.Parallel() 227 228 type args struct { 229 absCgroupPath string 230 devID string 231 data *common.IOCostQoSData 232 } 233 tests := []struct { 234 name string 235 m *manager 236 args args 237 wantErr bool 238 }{ 239 { 240 name: "test apply io cost qos", 241 m: NewManager(), 242 args: args{ 243 absCgroupPath: "test-fake-path", 244 devID: "test", 245 data: &common.IOCostQoSData{ 246 Enable: 0, 247 }, 248 }, 249 wantErr: true, 250 }, 251 { 252 name: "test apply io cost qos with nil data", 253 m: NewManager(), 254 args: args{ 255 absCgroupPath: "test-fake-path", 256 devID: "test", 257 data: nil, 258 }, 259 wantErr: true, 260 }, 261 } 262 for _, tt := range tests { 263 tt := tt 264 t.Run(tt.name, func(t *testing.T) { 265 t.Parallel() 266 267 m := &manager{} 268 if err := m.ApplyIOCostQoS(tt.args.absCgroupPath, tt.args.devID, tt.args.data); (err != nil) != tt.wantErr { 269 t.Errorf("manager.ApplyIOCostQoS() error = %v, wantErr %v", err, tt.wantErr) 270 } 271 }) 272 } 273 } 274 275 func Test_manager_ApplyIOCostModel(t *testing.T) { 276 t.Parallel() 277 278 type args struct { 279 absCgroupPath string 280 devID string 281 data *common.IOCostModelData 282 } 283 tests := []struct { 284 name string 285 m *manager 286 args args 287 wantErr bool 288 }{ 289 { 290 name: "test apply io cost model", 291 m: NewManager(), 292 args: args{ 293 absCgroupPath: "test-fake-path", 294 devID: "test", 295 data: &common.IOCostModelData{ 296 CtrlMode: common.IOCostCtrlModeAuto, 297 }, 298 }, 299 wantErr: true, 300 }, 301 { 302 name: "test apply io cost model with nil data", 303 m: NewManager(), 304 args: args{ 305 absCgroupPath: "test-fake-path", 306 devID: "test", 307 data: nil, 308 }, 309 wantErr: true, 310 }, 311 } 312 for _, tt := range tests { 313 tt := tt 314 t.Run(tt.name, func(t *testing.T) { 315 t.Parallel() 316 317 m := &manager{} 318 if err := m.ApplyIOCostModel(tt.args.absCgroupPath, tt.args.devID, tt.args.data); (err != nil) != tt.wantErr { 319 t.Errorf("manager.ApplyIOCostModel() error = %v, wantErr %v", err, tt.wantErr) 320 } 321 }) 322 } 323 } 324 325 func Test_manager_ApplyIOWeight(t *testing.T) { 326 t.Parallel() 327 328 type args struct { 329 absCgroupPath string 330 devID string 331 weight uint64 332 } 333 tests := []struct { 334 name string 335 m *manager 336 args args 337 wantErr bool 338 }{ 339 { 340 name: "test apply io weight", 341 m: NewManager(), 342 args: args{ 343 absCgroupPath: "test-fake-path", 344 devID: "test", 345 weight: 100, 346 }, 347 wantErr: true, 348 }, 349 } 350 for _, tt := range tests { 351 tt := tt 352 t.Run(tt.name, func(t *testing.T) { 353 t.Parallel() 354 355 m := &manager{} 356 if err := m.ApplyIOWeight(tt.args.absCgroupPath, tt.args.devID, tt.args.weight); (err != nil) != tt.wantErr { 357 t.Errorf("manager.ApplyIOWeight() error = %v, wantErr %v", err, tt.wantErr) 358 } 359 }) 360 } 361 } 362 363 func Test_manager_ApplyUnifiedData(t *testing.T) { 364 t.Parallel() 365 366 type args struct { 367 absCgroupPath string 368 cgroupFileName string 369 data string 370 } 371 tests := []struct { 372 name string 373 m *manager 374 args args 375 wantErr bool 376 }{ 377 { 378 name: "test apply unified data", 379 m: NewManager(), 380 args: args{ 381 absCgroupPath: "test-fake-path", 382 cgroupFileName: "test-cg-file-name", 383 data: "test-data", 384 }, 385 wantErr: true, 386 }, 387 } 388 for _, tt := range tests { 389 tt := tt 390 t.Run(tt.name, func(t *testing.T) { 391 t.Parallel() 392 393 m := &manager{} 394 if err := m.ApplyUnifiedData(tt.args.absCgroupPath, tt.args.cgroupFileName, tt.args.data); (err != nil) != tt.wantErr { 395 t.Errorf("manager.ApplyUnifiedData() error = %v, wantErr %v", err, tt.wantErr) 396 } 397 }) 398 } 399 } 400 401 func Test_manager_GetMemory(t *testing.T) { 402 t.Parallel() 403 404 type args struct { 405 absCgroupPath string 406 } 407 tests := []struct { 408 name string 409 m *manager 410 args args 411 want *common.MemoryStats 412 wantErr bool 413 }{ 414 { 415 name: "test get memory", 416 m: NewManager(), 417 args: args{ 418 absCgroupPath: "test-fake-path", 419 }, 420 want: nil, 421 wantErr: true, 422 }, 423 } 424 for _, tt := range tests { 425 tt := tt 426 t.Run(tt.name, func(t *testing.T) { 427 t.Parallel() 428 429 m := &manager{} 430 got, err := m.GetMemory(tt.args.absCgroupPath) 431 if (err != nil) != tt.wantErr { 432 t.Errorf("manager.GetMemory() error = %v, wantErr %v", err, tt.wantErr) 433 return 434 } 435 if !reflect.DeepEqual(got, tt.want) { 436 t.Errorf("manager.GetMemory() = %v, want %v", got, tt.want) 437 } 438 }) 439 } 440 } 441 442 func Test_manager_GetCPUSet(t *testing.T) { 443 t.Parallel() 444 445 type args struct { 446 absCgroupPath string 447 } 448 tests := []struct { 449 name string 450 m *manager 451 args args 452 want *common.CPUSetStats 453 wantErr bool 454 }{ 455 { 456 name: "test get cpuset", 457 m: NewManager(), 458 args: args{ 459 absCgroupPath: "test-fake-path", 460 }, 461 want: nil, 462 wantErr: true, 463 }, 464 } 465 for _, tt := range tests { 466 tt := tt 467 t.Run(tt.name, func(t *testing.T) { 468 t.Parallel() 469 470 m := &manager{} 471 got, err := m.GetCPUSet(tt.args.absCgroupPath) 472 if (err != nil) != tt.wantErr { 473 t.Errorf("manager.GetCPUSet() error = %v, wantErr %v", err, tt.wantErr) 474 return 475 } 476 if !reflect.DeepEqual(got, tt.want) { 477 t.Errorf("manager.GetCPUSet() = %v, want %v", got, tt.want) 478 } 479 }) 480 } 481 } 482 483 func Test_manager_GetCPU(t *testing.T) { 484 t.Parallel() 485 486 type args struct { 487 absCgroupPath string 488 } 489 tests := []struct { 490 name string 491 m *manager 492 args args 493 want *common.CPUStats 494 wantErr bool 495 }{ 496 { 497 name: "test get cpu", 498 m: NewManager(), 499 args: args{ 500 absCgroupPath: "test-fake-path", 501 }, 502 want: nil, 503 wantErr: true, 504 }, 505 } 506 for _, tt := range tests { 507 tt := tt 508 t.Run(tt.name, func(t *testing.T) { 509 t.Parallel() 510 511 m := &manager{} 512 got, err := m.GetCPU(tt.args.absCgroupPath) 513 if (err != nil) != tt.wantErr { 514 t.Errorf("manager.GetCPU() error = %v, wantErr %v", err, tt.wantErr) 515 return 516 } 517 if !reflect.DeepEqual(got, tt.want) { 518 t.Errorf("manager.GetCPU() = %v, want %v", got, tt.want) 519 } 520 }) 521 } 522 } 523 524 func Test_manager_GetIOCostQoS(t *testing.T) { 525 t.Parallel() 526 527 type args struct { 528 absCgroupPath string 529 } 530 tests := []struct { 531 name string 532 m *manager 533 args args 534 want map[string]*common.IOCostQoSData 535 wantErr bool 536 }{ 537 { 538 name: "test get io cost qos", 539 m: NewManager(), 540 args: args{ 541 absCgroupPath: "test-fake-path", 542 }, 543 want: nil, 544 wantErr: true, 545 }, 546 } 547 for _, tt := range tests { 548 tt := tt 549 t.Run(tt.name, func(t *testing.T) { 550 t.Parallel() 551 552 m := &manager{} 553 got, err := m.GetIOCostQoS(tt.args.absCgroupPath) 554 if (err != nil) != tt.wantErr { 555 t.Errorf("manager.GetIOCostQoS() error = %v, wantErr %v", err, tt.wantErr) 556 return 557 } 558 if !reflect.DeepEqual(got, tt.want) { 559 t.Errorf("manager.GetIOCostQoS() = %v, want %v", got, tt.want) 560 } 561 }) 562 } 563 } 564 565 func Test_manager_GetIOCostModel(t *testing.T) { 566 t.Parallel() 567 568 type args struct { 569 absCgroupPath string 570 } 571 tests := []struct { 572 name string 573 m *manager 574 args args 575 want map[string]*common.IOCostModelData 576 wantErr bool 577 }{ 578 { 579 name: "test get io cost model", 580 m: NewManager(), 581 args: args{ 582 absCgroupPath: "test-fake-path", 583 }, 584 want: nil, 585 wantErr: true, 586 }, 587 } 588 for _, tt := range tests { 589 tt := tt 590 t.Run(tt.name, func(t *testing.T) { 591 t.Parallel() 592 593 m := &manager{} 594 got, err := m.GetIOCostModel(tt.args.absCgroupPath) 595 if (err != nil) != tt.wantErr { 596 t.Errorf("manager.GetIOCostModel() error = %v, wantErr %v", err, tt.wantErr) 597 return 598 } 599 if !reflect.DeepEqual(got, tt.want) { 600 t.Errorf("manager.GetIOCostModel() = %v, want %v", got, tt.want) 601 } 602 }) 603 } 604 } 605 606 func Test_manager_GetDeviceIOWeight(t *testing.T) { 607 t.Parallel() 608 609 type args struct { 610 absCgroupPath string 611 devID string 612 } 613 tests := []struct { 614 name string 615 m *manager 616 args args 617 want uint64 618 want1 bool 619 wantErr bool 620 }{ 621 { 622 name: "test get io weight", 623 m: NewManager(), 624 args: args{ 625 absCgroupPath: "test-fake-path", 626 devID: "test", 627 }, 628 want: 0, 629 want1: false, 630 wantErr: true, 631 }, 632 } 633 for _, tt := range tests { 634 tt := tt 635 t.Run(tt.name, func(t *testing.T) { 636 t.Parallel() 637 638 m := &manager{} 639 got, got1, err := m.GetDeviceIOWeight(tt.args.absCgroupPath, tt.args.devID) 640 if (err != nil) != tt.wantErr { 641 t.Errorf("manager.GetDeviceIOWeight() error = %v, wantErr %v", err, tt.wantErr) 642 return 643 } 644 if got != tt.want { 645 t.Errorf("manager.GetDeviceIOWeight() got = %v, want %v", got, tt.want) 646 } 647 if got1 != tt.want1 { 648 t.Errorf("manager.GetDeviceIOWeight() got1 = %v, want %v", got1, tt.want1) 649 } 650 }) 651 } 652 } 653 654 func Test_manager_GetIOStat(t *testing.T) { 655 t.Parallel() 656 657 type args struct { 658 absCgroupPath string 659 } 660 tests := []struct { 661 name string 662 m *manager 663 args args 664 want map[string]map[string]string 665 wantErr bool 666 }{ 667 { 668 name: "test get io stat", 669 m: NewManager(), 670 args: args{ 671 absCgroupPath: "test-fake-path", 672 }, 673 want: nil, 674 wantErr: true, 675 }, 676 } 677 for _, tt := range tests { 678 tt := tt 679 t.Run(tt.name, func(t *testing.T) { 680 t.Parallel() 681 682 m := &manager{} 683 got, err := m.GetIOStat(tt.args.absCgroupPath) 684 if (err != nil) != tt.wantErr { 685 t.Errorf("manager.GetIOStat() error = %v, wantErr %v", err, tt.wantErr) 686 return 687 } 688 if !reflect.DeepEqual(got, tt.want) { 689 t.Errorf("manager.GetIOStat() = %v, want %v", got, tt.want) 690 } 691 }) 692 } 693 } 694 695 func Test_manager_GetMetrics(t *testing.T) { 696 t.Parallel() 697 698 type args struct { 699 relCgroupPath string 700 in1 map[string]struct{} 701 } 702 tests := []struct { 703 name string 704 m *manager 705 args args 706 want *common.CgroupMetrics 707 wantErr bool 708 }{ 709 { 710 name: "test get metrics", 711 m: NewManager(), 712 args: args{ 713 relCgroupPath: "test-fake-path", 714 }, 715 want: nil, 716 wantErr: true, 717 }, 718 } 719 for _, tt := range tests { 720 tt := tt 721 t.Run(tt.name, func(t *testing.T) { 722 t.Parallel() 723 724 m := &manager{} 725 got, err := m.GetMetrics(tt.args.relCgroupPath, tt.args.in1) 726 if (err != nil) != tt.wantErr { 727 t.Errorf("manager.GetMetrics() error = %v, wantErr %v", err, tt.wantErr) 728 return 729 } 730 if !reflect.DeepEqual(got, tt.want) { 731 t.Errorf("manager.GetMetrics() = %v, want %v", got, tt.want) 732 } 733 }) 734 } 735 } 736 737 func Test_manager_GetPids(t *testing.T) { 738 t.Parallel() 739 740 type args struct { 741 absCgroupPath string 742 } 743 tests := []struct { 744 name string 745 m *manager 746 args args 747 want []string 748 wantErr bool 749 }{ 750 { 751 name: "test get pids", 752 m: NewManager(), 753 args: args{ 754 absCgroupPath: "test-fake-path", 755 }, 756 want: nil, 757 wantErr: true, 758 }, 759 } 760 for _, tt := range tests { 761 tt := tt 762 t.Run(tt.name, func(t *testing.T) { 763 t.Parallel() 764 765 m := &manager{} 766 got, err := m.GetPids(tt.args.absCgroupPath) 767 if (err != nil) != tt.wantErr { 768 t.Errorf("manager.GetPids() error = %v, wantErr %v", err, tt.wantErr) 769 return 770 } 771 if !reflect.DeepEqual(got, tt.want) { 772 t.Errorf("manager.GetPids() = %v, want %v", got, tt.want) 773 } 774 }) 775 } 776 } 777 778 func Test_manager_GetTasks(t *testing.T) { 779 t.Parallel() 780 781 type args struct { 782 absCgroupPath string 783 } 784 tests := []struct { 785 name string 786 m *manager 787 args args 788 want []string 789 wantErr bool 790 }{ 791 { 792 name: "test get tasks", 793 m: NewManager(), 794 args: args{ 795 absCgroupPath: "test-fake-path", 796 }, 797 want: nil, 798 wantErr: true, 799 }, 800 } 801 for _, tt := range tests { 802 tt := tt 803 t.Run(tt.name, func(t *testing.T) { 804 t.Parallel() 805 806 m := &manager{} 807 got, err := m.GetTasks(tt.args.absCgroupPath) 808 if (err != nil) != tt.wantErr { 809 t.Errorf("manager.GetTasks() error = %v, wantErr %v", err, tt.wantErr) 810 return 811 } 812 if !reflect.DeepEqual(got, tt.want) { 813 t.Errorf("manager.GetTasks() = %v, want %v", got, tt.want) 814 } 815 }) 816 } 817 } 818 819 func Test_numToStr(t *testing.T) { 820 t.Parallel() 821 822 type args struct { 823 value int64 824 } 825 tests := []struct { 826 name string 827 args args 828 wantRet string 829 }{ 830 { 831 name: "test num to str", 832 args: args{ 833 value: 1000, 834 }, 835 wantRet: "1000", 836 }, 837 } 838 for _, tt := range tests { 839 tt := tt 840 t.Run(tt.name, func(t *testing.T) { 841 t.Parallel() 842 if gotRet := numToStr(tt.args.value); gotRet != tt.wantRet { 843 t.Errorf("numToStr() = %v, want %v", gotRet, tt.wantRet) 844 } 845 }) 846 } 847 } 848 849 func Test_parseDeviceIOCostQoS(t *testing.T) { 850 t.Parallel() 851 852 type args struct { 853 str string 854 } 855 tests := []struct { 856 name string 857 args args 858 want string 859 want1 *common.IOCostQoSData 860 wantErr bool 861 }{ 862 { 863 name: "test parse device io cost qos", 864 args: args{ 865 str: "8:160 enable=0 ctrl=auto rpct=0.00 rlat=250000 wpct=0.00 wlat=250000 min=1.00 max=10000.00", 866 }, 867 want: "8:160", 868 want1: &common.IOCostQoSData{ 869 Enable: 0, 870 CtrlMode: common.IOCostCtrlModeAuto, 871 ReadLatencyPercent: 0, 872 ReadLatencyUS: 250000, 873 WriteLatencyPercent: 0, 874 WriteLatencyUS: 250000, 875 VrateMin: 1, 876 VrateMax: 10000, 877 }, 878 wantErr: false, 879 }, 880 } 881 for _, tt := range tests { 882 tt := tt 883 t.Run(tt.name, func(t *testing.T) { 884 t.Parallel() 885 886 got, got1, err := parseDeviceIOCostQoS(tt.args.str) 887 if (err != nil) != tt.wantErr { 888 t.Errorf("parseDeviceIOCostQoS() error = %v, wantErr %v", err, tt.wantErr) 889 return 890 } 891 if got != tt.want { 892 t.Errorf("parseDeviceIOCostQoS() got = %v, want %v", got, tt.want) 893 } 894 if !reflect.DeepEqual(got1, tt.want1) { 895 t.Errorf("parseDeviceIOCostQoS() got1 = %v, want %v", got1, tt.want1) 896 } 897 }) 898 } 899 } 900 901 func Test_parseDeviceIOCostModel(t *testing.T) { 902 t.Parallel() 903 904 type args struct { 905 str string 906 } 907 tests := []struct { 908 name string 909 args args 910 want string 911 want1 *common.IOCostModelData 912 wantErr bool 913 }{ 914 { 915 name: "test parse device io cost model", 916 args: args{ 917 str: "8:160 ctrl=auto model=linear rbps=174019176 rseqiops=41708 rrandiops=370 wbps=178075866 wseqiops=42705 wrandiops=378", 918 }, 919 want: "8:160", 920 want1: &common.IOCostModelData{ 921 CtrlMode: common.IOCostCtrlModeAuto, 922 Model: common.IOCostModelLinear, 923 ReadBPS: 174019176, 924 ReadSeqIOPS: 41708, 925 ReadRandIOPS: 370, 926 WriteBPS: 178075866, 927 WriteSeqIOPS: 42705, 928 WriteRandIOPS: 378, 929 }, 930 wantErr: false, 931 }, 932 } 933 for _, tt := range tests { 934 tt := tt 935 t.Run(tt.name, func(t *testing.T) { 936 t.Parallel() 937 938 got, got1, err := parseDeviceIOCostModel(tt.args.str) 939 if (err != nil) != tt.wantErr { 940 t.Errorf("parseDeviceIOCostModel() error = %v, wantErr %v", err, tt.wantErr) 941 return 942 } 943 if got != tt.want { 944 t.Errorf("parseDeviceIOCostModel() got = %v, want %v", got, tt.want) 945 } 946 if !reflect.DeepEqual(got1, tt.want1) { 947 t.Errorf("parseDeviceIOCostModel() got1 = %v, want %v", got1, tt.want1) 948 } 949 }) 950 } 951 }