// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: AGPL-3.0

package crunchstat

import (
	"bufio"
	"io"
	"log"
	"os"
	"regexp"
	"testing"
)

func bufLogger() (*log.Logger, *bufio.Reader) {
	r, w := io.Pipe()
	logger := log.New(w, "", 0)
	return logger, bufio.NewReader(r)
}

func TestReadAllOrWarnFail(t *testing.T) {
	logger, rcv := bufLogger()
	rep := Reporter{Logger: logger}

	done := make(chan bool)
	var msg []byte
	var err error
	go func() {
		msg, err = rcv.ReadBytes('\n')
		close(done)
	}()
	{
		// The special file /proc/self/mem can be opened for
		// reading, but reading from byte 0 returns an error.
		f, err := os.Open("/proc/self/mem")
		if err != nil {
			t.Fatalf("Opening /proc/self/mem: %s", err)
		}
		if x, err := rep.readAllOrWarn(f); err == nil {
			t.Fatalf("Expected error, got %v", x)
		}
	}
	<-done
	if err != nil {
		t.Fatal(err)
	} else if matched, err := regexp.MatchString("^warning: read /proc/self/mem: .*", string(msg)); err != nil || !matched {
		t.Fatalf("Expected error message about unreadable file, got \"%s\"", msg)
	}
}

func TestReadAllOrWarnSuccess(t *testing.T) {
	rep := Reporter{Logger: log.New(os.Stderr, "", 0)}

	f, err := os.Open("./crunchstat_test.go")
	if err != nil {
		t.Fatalf("Opening ./crunchstat_test.go: %s", err)
	}
	data, err := rep.readAllOrWarn(f)
	if err != nil {
		t.Fatalf("got error %s", err)
	}
	if matched, err := regexp.MatchString("\npackage crunchstat\n", string(data)); err != nil || !matched {
		t.Fatalf("data failed regexp: err %v, matched %v", err, matched)
	}
}