17119: implement review feedback.
[arvados.git] / lib / crunchstat / crunchstat_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package crunchstat
6
7 import (
8         "bufio"
9         "io"
10         "log"
11         "os"
12         "regexp"
13         "testing"
14 )
15
16 func bufLogger() (*log.Logger, *bufio.Reader) {
17         r, w := io.Pipe()
18         logger := log.New(w, "", 0)
19         return logger, bufio.NewReader(r)
20 }
21
22 func TestReadAllOrWarnFail(t *testing.T) {
23         logger, rcv := bufLogger()
24         rep := Reporter{Logger: logger}
25
26         done := make(chan bool)
27         var msg []byte
28         var err error
29         go func() {
30                 msg, err = rcv.ReadBytes('\n')
31                 close(done)
32         }()
33         {
34                 // The special file /proc/self/mem can be opened for
35                 // reading, but reading from byte 0 returns an error.
36                 f, err := os.Open("/proc/self/mem")
37                 if err != nil {
38                         t.Fatalf("Opening /proc/self/mem: %s", err)
39                 }
40                 if x, err := rep.readAllOrWarn(f); err == nil {
41                         t.Fatalf("Expected error, got %v", x)
42                 }
43         }
44         <-done
45         if err != nil {
46                 t.Fatal(err)
47         } else if matched, err := regexp.MatchString("^warning: read /proc/self/mem: .*", string(msg)); err != nil || !matched {
48                 t.Fatalf("Expected error message about unreadable file, got \"%s\"", msg)
49         }
50 }
51
52 func TestReadAllOrWarnSuccess(t *testing.T) {
53         rep := Reporter{Logger: log.New(os.Stderr, "", 0)}
54
55         f, err := os.Open("./crunchstat_test.go")
56         if err != nil {
57                 t.Fatalf("Opening ./crunchstat_test.go: %s", err)
58         }
59         data, err := rep.readAllOrWarn(f)
60         if err != nil {
61                 t.Fatalf("got error %s", err)
62         }
63         if matched, err := regexp.MatchString("\npackage crunchstat\n", string(data)); err != nil || !matched {
64                 t.Fatalf("data failed regexp: err %v, matched %v", err, matched)
65         }
66 }