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 }