package worker /* ***** BEGIN GPL LICENSE BLOCK ***** * * Original Code Copyright (C) 2022 Blender Foundation. * * This file is part of Flamenco. * * Flamenco is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * Flamenco is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Flamenco. If not, see . * * ***** END GPL LICENSE BLOCK ***** */ import ( "context" "testing" "time" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "gitlab.com/blender/flamenco-ng-poc/internal/worker/mocks" "gitlab.com/blender/flamenco-ng-poc/pkg/api" ) func TestCommandEcho(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() listener := mocks.NewMockCommandListener(mockCtrl) clock := mockedClock(t) ce := NewCommandExecutor(listener, clock) ctx := context.Background() message := "понављај за мном" taskID := "90e9d656-e201-4ef0-b6b0-c80684fafa27" cmd := api.Command{ Name: "echo", Settings: map[string]interface{}{"message": message}, } listener.EXPECT().LogProduced(gomock.Any(), taskID, "echo: \"понављај за мном\"") err := ce.Run(ctx, taskID, cmd) assert.NoError(t, err) } func TestCommandSleep(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() listener := mocks.NewMockCommandListener(mockCtrl) clock := mockedClock(t) ce := NewCommandExecutor(listener, clock) ctx := context.Background() taskID := "90e9d656-e201-4ef0-b6b0-c80684fafa27" cmd := api.Command{ Name: "sleep", Settings: map[string]interface{}{"duration_in_seconds": 47}, } listener.EXPECT().LogProduced(gomock.Any(), taskID, "slept 47s") timeBefore := clock.Now() // Run the test in a goroutine, as we also need to actually increase the // mocked clock at the same time; without that, the command will sleep // indefinitely. runDone := make(chan struct{}) var err error go func() { err = ce.Run(ctx, taskID, cmd) close(runDone) }() timeStepSize := 1 * time.Second loop: for { select { case <-runDone: break loop default: clock.Add(timeStepSize) } } assert.NoError(t, err) timeAfter := clock.Now() // Within the step size is precise enough. We're testing our implementation, not the precision of `time.After()`. assert.WithinDuration(t, timeBefore.Add(47*time.Second), timeAfter, timeStepSize) }