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  }