github.com/kubeshop/testkube@v1.17.23/contrib/executor/jmeter/pkg/runner/runner_integration_test.go (about)

     1  package runner
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"github.com/kubeshop/testkube/pkg/envs"
    12  
    13  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    14  	"github.com/kubeshop/testkube/pkg/utils/test"
    15  )
    16  
    17  func TestRun_Integration(t *testing.T) {
    18  	test.IntegrationTest(t)
    19  	t.Parallel()
    20  
    21  	ctx := context.Background()
    22  
    23  	assert.NoError(t, os.Setenv("ENTRYPOINT_CMD", "jmeter"))
    24  
    25  	t.Run("run successful jmeter test", func(t *testing.T) {
    26  		t.Parallel()
    27  
    28  		tempDir, err := os.MkdirTemp("", "*")
    29  		assert.NoErrorf(t, err, "failed to create temp dir: %v", err)
    30  		defer os.RemoveAll(tempDir)
    31  
    32  		params := envs.Params{DataDir: tempDir}
    33  		runner, err := NewRunner(ctx, params)
    34  		assert.NoError(t, err)
    35  
    36  		execution := testkube.NewQueuedExecution()
    37  		execution.TestType = "jmeter/test"
    38  		execution.Content = testkube.NewStringTestContent("")
    39  		execution.Command = []string{
    40  			"<entryPoint>",
    41  		}
    42  		execution.Args = []string{
    43  			"-n",
    44  			"-j",
    45  			"<logFile>",
    46  			"-t",
    47  			"<runPath>",
    48  			"-l",
    49  			"<jtlFile>",
    50  			"-e",
    51  			"-o",
    52  			"<reportFile>",
    53  			"<envVars>",
    54  		}
    55  		writeTestContent(t, tempDir, "../../examples/kubeshop.jmx")
    56  
    57  		execution.Variables = map[string]testkube.Variable{}
    58  
    59  		result, err := runner.Run(ctx, *execution)
    60  
    61  		assert.NoError(t, err)
    62  		assert.Empty(t, result.ErrorMessage)
    63  		assert.Equal(t, testkube.ExecutionStatusPassed, result.Status)
    64  		assert.Len(t, result.Steps, 1)
    65  
    66  		err = cleanup(tempDir)
    67  		assert.NoError(t, err)
    68  	})
    69  
    70  	t.Run("run failing jmeter test", func(t *testing.T) {
    71  		t.Parallel()
    72  
    73  		tempDir, err := os.MkdirTemp("", "*")
    74  		assert.NoErrorf(t, err, "failed to create temp dir: %v", err)
    75  		defer os.RemoveAll(tempDir)
    76  
    77  		params := envs.Params{DataDir: tempDir}
    78  		runner, err := NewRunner(ctx, params)
    79  		assert.NoError(t, err)
    80  
    81  		execution := testkube.NewQueuedExecution()
    82  		execution.TestType = "jmeter/test"
    83  		execution.Content = testkube.NewStringTestContent("")
    84  		execution.Command = []string{
    85  			"<entryPoint>",
    86  		}
    87  		execution.Args = []string{
    88  			"-n",
    89  			"-j",
    90  			"<logFile>",
    91  			"-t",
    92  			"<runPath>",
    93  			"-l",
    94  			"<jtlFile>",
    95  			"-e",
    96  			"-o",
    97  			"<reportFile>",
    98  			"<envVars>",
    99  		}
   100  		writeTestContent(t, tempDir, "../../examples/kubeshop_failed.jmx")
   101  
   102  		execution.Variables = map[string]testkube.Variable{}
   103  
   104  		result, err := runner.Run(ctx, *execution)
   105  
   106  		assert.NoError(t, err)
   107  		assert.Equal(t, "Test failed: text expected to contain /SOME_NONExisting_String/", result.ErrorMessage)
   108  		assert.Equal(t, testkube.ExecutionStatusFailed, result.Status)
   109  		assert.Len(t, result.Steps, 1)
   110  
   111  		err = cleanup(tempDir)
   112  		assert.NoError(t, err)
   113  	})
   114  
   115  	t.Run("run successful jmeter test with arguments", func(t *testing.T) {
   116  		t.Parallel()
   117  
   118  		tempDir, err := os.MkdirTemp("", "*")
   119  		assert.NoErrorf(t, err, "failed to create temp dir: %v", err)
   120  		defer os.RemoveAll(tempDir)
   121  
   122  		params := envs.Params{DataDir: tempDir}
   123  		runner, err := NewRunner(ctx, params)
   124  		assert.NoError(t, err)
   125  
   126  		execution := testkube.NewQueuedExecution()
   127  		execution.TestType = "jmeter/test"
   128  		execution.Content = testkube.NewStringTestContent("")
   129  		execution.Command = []string{
   130  			"<entryPoint>",
   131  		}
   132  		execution.Args = []string{
   133  			"-n",
   134  			"-j",
   135  			"<logFile>",
   136  			"-t",
   137  			"<runPath>",
   138  			"-l",
   139  			"<jtlFile>",
   140  			"-e",
   141  			"-o",
   142  			"<reportFile>",
   143  			"<envVars>",
   144  			"-Jthreads",
   145  			"10",
   146  			"-Jrampup",
   147  			"0",
   148  			"-Jloopcount",
   149  			"1",
   150  			"-Jip",
   151  			"sampleip",
   152  			"-Jport",
   153  			"1234",
   154  		}
   155  		writeTestContent(t, tempDir, "../../examples/kubeshop.jmx")
   156  
   157  		result, err := runner.Run(ctx, *execution)
   158  
   159  		assert.NoError(t, err)
   160  		assert.Empty(t, result.ErrorMessage)
   161  		assert.Equal(t, testkube.ExecutionStatusPassed, result.Status)
   162  		assert.Len(t, result.Steps, 1)
   163  
   164  		err = cleanup(tempDir)
   165  		assert.NoError(t, err)
   166  	})
   167  
   168  }
   169  
   170  func cleanup(tempDir string) error {
   171  	return os.RemoveAll(filepath.Join(tempDir, "output"))
   172  }
   173  
   174  func writeTestContent(t *testing.T, dir string, testScript string) {
   175  	jmeterScript, err := os.ReadFile(testScript)
   176  	if err != nil {
   177  		assert.FailNow(t, "Unable to read jmeter test script")
   178  	}
   179  
   180  	err = os.WriteFile(filepath.Join(dir, "test-content"), jmeterScript, 0644)
   181  	if err != nil {
   182  		assert.FailNow(t, "Unable to write jmeter runner test content file")
   183  	}
   184  }