github.com/eth-easl/loader@v0.0.0-20230908084258-8a37e1d94279/pkg/trace/profiler_test.go (about)

     1  /*
     2   * MIT License
     3   *
     4   * Copyright (c) 2023 EASL and the vHive community
     5   *
     6   * Permission is hereby granted, free of charge, to any person obtaining a copy
     7   * of this software and associated documentation files (the "Software"), to deal
     8   * in the Software without restriction, including without limitation the rights
     9   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    10   * copies of the Software, and to permit persons to whom the Software is
    11   * furnished to do so, subject to the following conditions:
    12   *
    13   * The above copyright notice and this permission notice shall be included in all
    14   * copies or substantial portions of the Software.
    15   *
    16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    19   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    22   * SOFTWARE.
    23   */
    24  
    25  package trace
    26  
    27  import (
    28  	"github.com/eth-easl/loader/pkg/common"
    29  	"testing"
    30  )
    31  
    32  func TestStaticTraceProfiling(t *testing.T) {
    33  	tests := []struct {
    34  		testName             string
    35  		IPM                  int
    36  		memoryMaxPercentile  float64
    37  		expectedInitialScale int
    38  		expectedCPULimits    int
    39  	}{
    40  		{
    41  			testName:             "concurrency_30ipm",
    42  			IPM:                  30,
    43  			memoryMaxPercentile:  256,
    44  			expectedInitialScale: 1,
    45  			expectedCPULimits:    167,
    46  		},
    47  		{
    48  			testName:             "concurrency_45ipm",
    49  			IPM:                  45,
    50  			memoryMaxPercentile:  512,
    51  			expectedInitialScale: 2,
    52  			expectedCPULimits:    333,
    53  		},
    54  		{
    55  			testName:             "concurrency_60ipm",
    56  			IPM:                  60,
    57  			memoryMaxPercentile:  1024,
    58  			expectedInitialScale: 2,
    59  			expectedCPULimits:    583,
    60  		},
    61  		{
    62  			testName:             "concurrency_120ipm",
    63  			IPM:                  120,
    64  			memoryMaxPercentile:  2048,
    65  			expectedInitialScale: 4,
    66  			expectedCPULimits:    1000,
    67  		},
    68  	}
    69  
    70  	for _, test := range tests {
    71  		t.Run(test.testName, func(t *testing.T) {
    72  			f := &common.Function{
    73  				InvocationStats: &common.FunctionInvocationStats{
    74  					Invocations: []int{test.IPM},
    75  				},
    76  				RuntimeStats: &common.FunctionRuntimeStats{
    77  					Average: 2000.0,
    78  				},
    79  				MemoryStats: &common.FunctionMemoryStats{
    80  					Percentile100: test.memoryMaxPercentile,
    81  				},
    82  			}
    83  
    84  			DoStaticTraceProfiling([]*common.Function{f})
    85  			ApplyResourceLimits([]*common.Function{f})
    86  
    87  			if f.InitialScale != test.expectedInitialScale ||
    88  				f.CPULimitsMilli != test.expectedCPULimits ||
    89  				f.CPURequestsMilli != f.CPULimitsMilli/common.OvercommitmentRatio ||
    90  				f.MemoryRequestsMiB != int(test.memoryMaxPercentile)/common.OvercommitmentRatio {
    91  
    92  				t.Error("Wrong static trace profile.")
    93  			}
    94  		})
    95  	}
    96  }