github.com/kubewharf/katalyst-core@v0.5.3/pkg/agent/sysadvisor/plugin/inference/inference_test.go (about)

     1  /*
     2  Copyright 2022 The Katalyst Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package inference
    18  
    19  import (
    20  	"context"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/metacache"
    25  	"github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/plugin/inference/modelresultfetcher"
    26  	borweinfetcher "github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/plugin/inference/modelresultfetcher/borwein"
    27  	"github.com/kubewharf/katalyst-core/pkg/agent/sysadvisor/types"
    28  	"github.com/kubewharf/katalyst-core/pkg/config"
    29  	"github.com/kubewharf/katalyst-core/pkg/metaserver"
    30  	"github.com/kubewharf/katalyst-core/pkg/metrics"
    31  	metricspool "github.com/kubewharf/katalyst-core/pkg/metrics/metrics-pool"
    32  )
    33  
    34  func NewNilModelResultFetcher(fetcherName string, conf *config.Configuration, extraConf interface{},
    35  	emitterPool metricspool.MetricsEmitterPool, metaServer *metaserver.MetaServer,
    36  	metaCache metacache.MetaCache,
    37  ) (modelresultfetcher.ModelResultFetcher, error) {
    38  	return nil, nil
    39  }
    40  
    41  func TestNewInferencePlugin(t *testing.T) {
    42  	t.Parallel()
    43  	type args struct {
    44  		pluginName  string
    45  		conf        *config.Configuration
    46  		extraConf   interface{}
    47  		emitterPool metricspool.MetricsEmitterPool
    48  		metaServer  *metaserver.MetaServer
    49  		metaCache   metacache.MetaCache
    50  	}
    51  	conf := config.NewConfiguration()
    52  	conf.InferencePluginConfiguration.SyncPeriod = 5 * time.Second
    53  	tests := []struct {
    54  		name    string
    55  		args    args
    56  		wantErr bool
    57  	}{
    58  		{
    59  			name: "test new inference plugin",
    60  			args: args{
    61  				pluginName:  types.AdvisorPluginNameInference,
    62  				conf:        conf,
    63  				emitterPool: metricspool.DummyMetricsEmitterPool{},
    64  				metaServer:  &metaserver.MetaServer{},
    65  				metaCache:   &metacache.MetaCacheImp{},
    66  			},
    67  			wantErr: false,
    68  		},
    69  	}
    70  
    71  	modelresultfetcher.RegisterModelResultFetcherInitFunc(borweinfetcher.BorweinModelResultFetcherName,
    72  		modelresultfetcher.NewDummyModelResultFetcher)
    73  	modelresultfetcher.RegisterModelResultFetcherInitFunc("test-nil-fetcher",
    74  		NewNilModelResultFetcher)
    75  
    76  	for _, tt := range tests {
    77  		tt := tt
    78  		t.Run(tt.name, func(t *testing.T) {
    79  			t.Parallel()
    80  			_, err := NewInferencePlugin(tt.args.pluginName, tt.args.conf, tt.args.extraConf, tt.args.emitterPool, tt.args.metaServer, tt.args.metaCache)
    81  			if (err != nil) != tt.wantErr {
    82  				t.Errorf("NewInferencePlugin() error = %v, wantErr %v", err, tt.wantErr)
    83  				return
    84  			}
    85  		})
    86  	}
    87  }
    88  
    89  func TestInferencePlugin_Run(t *testing.T) {
    90  	t.Parallel()
    91  	type fields struct {
    92  		name                 string
    93  		period               time.Duration
    94  		modelsResultFetchers map[string]modelresultfetcher.ModelResultFetcher
    95  		metaServer           *metaserver.MetaServer
    96  		emitter              metrics.MetricEmitter
    97  		metaReader           metacache.MetaReader
    98  		metaWriter           metacache.MetaWriter
    99  	}
   100  	type args struct {
   101  		ctx context.Context
   102  	}
   103  	tests := []struct {
   104  		name   string
   105  		fields fields
   106  		args   args
   107  	}{
   108  		{
   109  			name: "test running inference plugin",
   110  			fields: fields{
   111  				name:   types.AdvisorPluginNameInference,
   112  				period: 5 * time.Second,
   113  				modelsResultFetchers: map[string]modelresultfetcher.ModelResultFetcher{
   114  					"test": modelresultfetcher.DummyModelResultFetcher{},
   115  				},
   116  				metaServer: &metaserver.MetaServer{},
   117  				emitter:    metrics.DummyMetrics{},
   118  			},
   119  		},
   120  	}
   121  	for _, tt := range tests {
   122  		tt := tt
   123  		t.Run(tt.name, func(t *testing.T) {
   124  			t.Parallel()
   125  
   126  			var cancel context.CancelFunc
   127  			tt.args.ctx, cancel = context.WithCancel(context.Background())
   128  			infp := &InferencePlugin{
   129  				name:                 tt.fields.name,
   130  				period:               tt.fields.period,
   131  				modelsResultFetchers: tt.fields.modelsResultFetchers,
   132  				metaServer:           tt.fields.metaServer,
   133  				metricEmitter:        tt.fields.emitter,
   134  				metaReader:           tt.fields.metaReader,
   135  				metaWriter:           tt.fields.metaWriter,
   136  			}
   137  			go infp.Run(tt.args.ctx)
   138  			cancel()
   139  		})
   140  	}
   141  }
   142  
   143  func TestInferencePlugin_Name(t *testing.T) {
   144  	t.Parallel()
   145  	type fields struct {
   146  		name                 string
   147  		period               time.Duration
   148  		modelsResultFetchers map[string]modelresultfetcher.ModelResultFetcher
   149  		metaServer           *metaserver.MetaServer
   150  		emitter              metrics.MetricEmitter
   151  		metaReader           metacache.MetaReader
   152  		metaWriter           metacache.MetaWriter
   153  	}
   154  	tests := []struct {
   155  		name   string
   156  		fields fields
   157  		want   string
   158  	}{
   159  		{
   160  			name: "test inference plugin name",
   161  			fields: fields{
   162  				name:   types.AdvisorPluginNameInference,
   163  				period: 5 * time.Second,
   164  				modelsResultFetchers: map[string]modelresultfetcher.ModelResultFetcher{
   165  					"test": modelresultfetcher.DummyModelResultFetcher{},
   166  				},
   167  				metaServer: &metaserver.MetaServer{},
   168  				emitter:    metrics.DummyMetrics{},
   169  			},
   170  			want: types.AdvisorPluginNameInference,
   171  		},
   172  	}
   173  	for _, tt := range tests {
   174  		tt := tt
   175  		t.Run(tt.name, func(t *testing.T) {
   176  			t.Parallel()
   177  
   178  			infp := &InferencePlugin{
   179  				name:                 tt.fields.name,
   180  				period:               tt.fields.period,
   181  				modelsResultFetchers: tt.fields.modelsResultFetchers,
   182  				metaServer:           tt.fields.metaServer,
   183  				metricEmitter:        tt.fields.emitter,
   184  				metaReader:           tt.fields.metaReader,
   185  				metaWriter:           tt.fields.metaWriter,
   186  			}
   187  			if got := infp.Name(); got != tt.want {
   188  				t.Errorf("InferencePlugin.Name() = %v, want %v", got, tt.want)
   189  			}
   190  		})
   191  	}
   192  }
   193  
   194  func TestInferencePlugin_Init(t *testing.T) {
   195  	t.Parallel()
   196  	type fields struct {
   197  		name                 string
   198  		period               time.Duration
   199  		modelsResultFetchers map[string]modelresultfetcher.ModelResultFetcher
   200  		metaServer           *metaserver.MetaServer
   201  		emitter              metrics.MetricEmitter
   202  		metaReader           metacache.MetaReader
   203  		metaWriter           metacache.MetaWriter
   204  	}
   205  	tests := []struct {
   206  		name    string
   207  		fields  fields
   208  		wantErr bool
   209  	}{
   210  		{
   211  			name: "test initializing inference plugin",
   212  			fields: fields{
   213  				name:   types.AdvisorPluginNameInference,
   214  				period: 5 * time.Second,
   215  				modelsResultFetchers: map[string]modelresultfetcher.ModelResultFetcher{
   216  					"test": modelresultfetcher.DummyModelResultFetcher{},
   217  				},
   218  				metaServer: &metaserver.MetaServer{},
   219  				emitter:    metrics.DummyMetrics{},
   220  			},
   221  			wantErr: false,
   222  		},
   223  	}
   224  	for _, tt := range tests {
   225  		tt := tt
   226  		t.Run(tt.name, func(t *testing.T) {
   227  			t.Parallel()
   228  
   229  			infp := &InferencePlugin{
   230  				name:                 tt.fields.name,
   231  				period:               tt.fields.period,
   232  				modelsResultFetchers: tt.fields.modelsResultFetchers,
   233  				metaServer:           tt.fields.metaServer,
   234  				metricEmitter:        tt.fields.emitter,
   235  				metaReader:           tt.fields.metaReader,
   236  				metaWriter:           tt.fields.metaWriter,
   237  			}
   238  			if err := infp.Init(); (err != nil) != tt.wantErr {
   239  				t.Errorf("InferencePlugin.Init() error = %v, wantErr %v", err, tt.wantErr)
   240  			}
   241  		})
   242  	}
   243  }
   244  
   245  func TestInferencePlugin_fetchModelResult(t *testing.T) {
   246  	t.Parallel()
   247  	type fields struct {
   248  		name                 string
   249  		period               time.Duration
   250  		modelsResultFetchers map[string]modelresultfetcher.ModelResultFetcher
   251  		metaServer           *metaserver.MetaServer
   252  		emitter              metrics.MetricEmitter
   253  		metaReader           metacache.MetaReader
   254  		metaWriter           metacache.MetaWriter
   255  	}
   256  	type args struct {
   257  		ctx context.Context
   258  	}
   259  	tests := []struct {
   260  		name   string
   261  		fields fields
   262  		args   args
   263  	}{
   264  		{
   265  			name: "test inference plugin fetching model result",
   266  			fields: fields{
   267  				name:   types.AdvisorPluginNameInference,
   268  				period: 5 * time.Second,
   269  				modelsResultFetchers: map[string]modelresultfetcher.ModelResultFetcher{
   270  					"test": modelresultfetcher.DummyModelResultFetcher{},
   271  				},
   272  				metaServer: &metaserver.MetaServer{},
   273  				emitter:    metrics.DummyMetrics{},
   274  			},
   275  		},
   276  	}
   277  	for _, tt := range tests {
   278  		tt := tt
   279  		t.Run(tt.name, func(t *testing.T) {
   280  			t.Parallel()
   281  			infp := &InferencePlugin{
   282  				name:                 tt.fields.name,
   283  				period:               tt.fields.period,
   284  				modelsResultFetchers: tt.fields.modelsResultFetchers,
   285  				metaServer:           tt.fields.metaServer,
   286  				metricEmitter:        tt.fields.emitter,
   287  				metaReader:           tt.fields.metaReader,
   288  				metaWriter:           tt.fields.metaWriter,
   289  			}
   290  			infp.fetchModelResult(tt.args.ctx)
   291  		})
   292  	}
   293  }