github.com/nilium/gitlab-runner@v12.5.0+incompatible/commands/single_test.go (about)

     1  package commands
     2  
     3  import (
     4  	"context"
     5  	"io/ioutil"
     6  	"os"
     7  	"syscall"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/mock"
    12  
    13  	"gitlab.com/gitlab-org/gitlab-runner/common"
    14  )
    15  
    16  func init() {
    17  	s := common.MockShell{}
    18  	s.On("GetName").Return("script-shell")
    19  	s.On("GenerateScript", mock.Anything, mock.Anything).Return("script", nil)
    20  	common.RegisterShell(&s)
    21  }
    22  
    23  type jobSimulation func(mock.Arguments)
    24  
    25  func TestSingleRunnerSigquit(t *testing.T) {
    26  	var sendQuitSignal func()
    27  
    28  	job := func(_ mock.Arguments) {
    29  		sendQuitSignal()
    30  		// simulate some real work while while sigquit get handled
    31  		time.Sleep(time.Second)
    32  	}
    33  
    34  	single, cleanup := mockingExecutionStack(t, "test-sigquit", 1, job)
    35  	defer cleanup()
    36  
    37  	sendQuitSignal = func() {
    38  		single.interruptSignals <- syscall.SIGQUIT
    39  	}
    40  
    41  	single.Execute(nil)
    42  }
    43  
    44  func TestSingleRunnerMaxBuilds(t *testing.T) {
    45  	maxBuilds := 7
    46  
    47  	single, cleanup := mockingExecutionStack(t, "test-max-build", maxBuilds, nil)
    48  	defer cleanup()
    49  
    50  	single.Execute(nil)
    51  }
    52  
    53  func newRunSingleCommand(executorName string, network common.Network) *RunSingleCommand {
    54  	return &RunSingleCommand{
    55  		network: network,
    56  		RunnerConfig: common.RunnerConfig{
    57  			RunnerSettings: common.RunnerSettings{
    58  				Executor: executorName,
    59  			},
    60  			RunnerCredentials: common.RunnerCredentials{
    61  				URL:   "http://example.com",
    62  				Token: "_test_token_",
    63  			},
    64  		},
    65  		interruptSignals: make(chan os.Signal),
    66  	}
    67  }
    68  
    69  func mockingExecutionStack(t *testing.T, executorName string, maxBuilds int, job jobSimulation) (*RunSingleCommand, func()) {
    70  	// mocking the whole stack
    71  	e := common.MockExecutor{}
    72  	p := common.MockExecutorProvider{}
    73  	mockNetwork := common.MockNetwork{}
    74  
    75  	//Network
    76  	jobData := common.JobResponse{}
    77  	_, cancel := context.WithCancel(context.Background())
    78  	jobTrace := common.Trace{Writer: ioutil.Discard, CancelFunc: cancel}
    79  	mockNetwork.On("RequestJob", mock.Anything, mock.Anything).Return(&jobData, true).Times(maxBuilds)
    80  	processJob := mockNetwork.On("ProcessJob", mock.Anything, mock.Anything).Return(&jobTrace, nil).Times(maxBuilds)
    81  	if job != nil {
    82  		processJob.Run(job)
    83  	}
    84  
    85  	//ExecutorProvider
    86  	p.On("CanCreate").Return(true).Once()
    87  	p.On("GetDefaultShell").Return("bash").Once()
    88  	p.On("GetFeatures", mock.Anything).Return(nil).Times(maxBuilds + 1)
    89  
    90  	p.On("Create").Return(&e).Times(maxBuilds)
    91  	p.On("Acquire", mock.Anything).Return(&common.MockExecutorData{}, nil).Times(maxBuilds)
    92  	p.On("Release", mock.Anything, mock.Anything).Return(nil).Times(maxBuilds)
    93  
    94  	//Executor
    95  	e.On("Prepare", mock.Anything, mock.Anything, mock.Anything).Return(nil).Times(maxBuilds)
    96  	e.On("Finish", nil).Return().Times(maxBuilds)
    97  	e.On("Cleanup").Return().Times(maxBuilds)
    98  
    99  	// Run script successfully
   100  	e.On("Shell").Return(&common.ShellScriptInfo{Shell: "script-shell"})
   101  	e.On("Run", mock.Anything).Return(nil)
   102  
   103  	common.RegisterExecutor(executorName, &p)
   104  
   105  	single := newRunSingleCommand(executorName, &mockNetwork)
   106  	single.MaxBuilds = maxBuilds
   107  	cleanup := func() {
   108  		e.AssertExpectations(t)
   109  		p.AssertExpectations(t)
   110  		mockNetwork.AssertExpectations(t)
   111  		cancel()
   112  	}
   113  
   114  	return single, cleanup
   115  }