package testutil

import (
	"bytes"
	"encoding/json"
	"io"
	"sync"
	"testing"

	"github.com/pomerium/pomerium/internal/log"
)

// CaptureLogs captures any logs made during the test. Time will be stripped.
// Any tests that use it should not be run in parallel.
func CaptureLogs(t *testing.T, f func()) string {
	t.Helper()

	pr, pw := io.Pipe()
	log.Writer.Add(pw)
	defer log.Writer.Remove(pw)

	var buf bytes.Buffer
	var wg sync.WaitGroup
	wg.Add(2)
	go func() {
		defer wg.Done()

		d := json.NewDecoder(pr)
		for {
			var m map[string]any
			if d.Decode(&m) != nil {
				break
			}
			delete(m, "time")
			bs, _ := json.Marshal(m)
			buf.Write(bs)
			buf.WriteByte('\n')
		}
	}()
	go func() {
		defer wg.Done()

		f()

		pw.Close()
	}()
	wg.Wait()

	return buf.String()
}