diff options
author | Gusted <postmaster@gusted.xyz> | 2024-04-03 01:17:25 +0200 |
---|---|---|
committer | Gusted <postmaster@gusted.xyz> | 2024-04-03 02:46:46 +0200 |
commit | 9320ffd2b5f02c6c94a231dbf51fc6883afff429 (patch) | |
tree | b1b2e7b261978ad78fc02ab24f5ffb0d63aa12dd /cmd/hook_test.go | |
parent | Merge pull request '[CI] backport workaround to cherry-pick in order' (#2953)... (diff) | |
download | forgejo-9320ffd2b5f02c6c94a231dbf51fc6883afff429.tar.xz forgejo-9320ffd2b5f02c6c94a231dbf51fc6883afff429.zip |
[BUG] Make delay writer actually work
- Reading the code of this delay writer implemenation, it looks like
that it should only actually write content to the `io.Writer` if x
amount of time has passed by. However in practice it was always printing
the buffer even if the X amount of time didn't pass yet. This is in line
with what was being said in the issue that this was to help with
https://github.com/go-gitea/gitea/issues/9610.
- This was caused by the extra `Close()` calls which in turn caused that
when the second `Close` is called (which is done in a defer already) it
would've printed the buffer anyway. So remove the extra calls to `Close()`.
- Add unit test.
Diffstat (limited to '')
-rw-r--r-- | cmd/hook_test.go | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/cmd/hook_test.go b/cmd/hook_test.go index d4e16dc411..0c1bee29f4 100644 --- a/cmd/hook_test.go +++ b/cmd/hook_test.go @@ -7,10 +7,20 @@ import ( "bufio" "bytes" "context" + "io" + "net/http" + "net/http/httptest" + "os" "strings" "testing" + "time" + + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v2" ) func TestPktLine(t *testing.T) { @@ -83,3 +93,72 @@ func TestPktLine(t *testing.T) { assert.Empty(t, w.Bytes()) }) } + +func TestDelayWriter(t *testing.T) { + // Setup the environment. + defer test.MockVariableValue(&setting.InternalToken, "Random")() + defer test.MockVariableValue(&setting.InstallLock, true)() + defer test.MockVariableValue(&setting.Git.VerbosePush, true)() + require.NoError(t, os.Setenv("SSH_ORIGINAL_COMMAND", "true")) + + // Setup the Stdin. + f, err := os.OpenFile(t.TempDir()+"/stdin", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0o666) + require.NoError(t, err) + _, err = f.Write([]byte("00000000000000000000 00000000000000000001 refs/head/main\n")) + require.NoError(t, err) + _, err = f.Seek(0, 0) + require.NoError(t, err) + defer test.MockVariableValue(os.Stdin, *f)() + + // Setup the server that processes the hooks. + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(time.Millisecond * 600) + })) + defer ts.Close() + defer test.MockVariableValue(&setting.LocalURL, ts.URL+"/")() + + app := cli.NewApp() + app.Commands = []*cli.Command{subcmdHookPreReceive} + + // Capture what's being written into stdout + captureStdout := func(t *testing.T) (finish func() (output string)) { + t.Helper() + + r, w, err := os.Pipe() + require.NoError(t, err) + resetStdout := test.MockVariableValue(os.Stdout, *w) + + return func() (output string) { + w.Close() + resetStdout() + + out, err := io.ReadAll(r) + require.NoError(t, err) + return string(out) + } + } + + t.Run("Should delay", func(t *testing.T) { + defer test.MockVariableValue(&setting.Git.VerbosePushDelay, time.Millisecond*500)() + finish := captureStdout(t) + + err = app.Run([]string{"./forgejo", "pre-receive"}) + require.NoError(t, err) + out := finish() + + require.Contains(t, out, "* Checking 1 references") + require.Contains(t, out, "Checked 1 references in total") + }) + + t.Run("Shouldn't delay", func(t *testing.T) { + defer test.MockVariableValue(&setting.Git.VerbosePushDelay, time.Second*5)() + finish := captureStdout(t) + + err = app.Run([]string{"./forgejo", "pre-receive"}) + require.NoError(t, err) + out := finish() + + require.NoError(t, err) + require.Empty(t, out) + }) +} |