github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/cmd/snap/cmd_warnings_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2018 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package main_test
    21  
    22  import (
    23  	"fmt"
    24  	"io/ioutil"
    25  	"net/http"
    26  	"time"
    27  
    28  	"gopkg.in/check.v1"
    29  
    30  	snap "github.com/snapcore/snapd/cmd/snap"
    31  )
    32  
    33  type warningSuite struct {
    34  	BaseSnapSuite
    35  }
    36  
    37  var _ = check.Suite(&warningSuite{})
    38  
    39  const twoWarnings = `{
    40  			"result": [
    41  			    {
    42  				"expire-after": "672h0m0s",
    43  				"first-added": "2018-09-19T12:41:18.505007495Z",
    44  				"last-added": "2018-09-19T12:41:18.505007495Z",
    45  				"message": "hello world number one",
    46  				"repeat-after": "24h0m0s"
    47  			    },
    48  			    {
    49  				"expire-after": "672h0m0s",
    50  				"first-added": "2018-09-19T12:44:19.680362867Z",
    51  				"last-added": "2018-09-19T12:44:19.680362867Z",
    52  				"message": "hello world number two",
    53  				"repeat-after": "24h0m0s"
    54  			    }
    55  			],
    56  			"status": "OK",
    57  			"status-code": 200,
    58  			"type": "sync"
    59  		}`
    60  
    61  func mkWarningsFakeHandler(c *check.C, body string) func(w http.ResponseWriter, r *http.Request) {
    62  	var called bool
    63  	return func(w http.ResponseWriter, r *http.Request) {
    64  		if called {
    65  			c.Fatalf("expected a single request")
    66  		}
    67  		called = true
    68  		c.Check(r.URL.Path, check.Equals, "/v2/warnings")
    69  		c.Check(r.URL.Query(), check.HasLen, 0)
    70  
    71  		buf, err := ioutil.ReadAll(r.Body)
    72  		c.Assert(err, check.IsNil)
    73  		c.Check(string(buf), check.Equals, "")
    74  		c.Check(r.Method, check.Equals, "GET")
    75  		w.WriteHeader(200)
    76  		fmt.Fprintln(w, body)
    77  	}
    78  }
    79  
    80  func (s *warningSuite) TestNoWarningsEver(c *check.C) {
    81  	s.RedirectClientToTestServer(mkWarningsFakeHandler(c, `{"type": "sync", "status-code": 200, "result": []}`))
    82  
    83  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"warnings", "--abs-time"})
    84  	c.Assert(err, check.IsNil)
    85  	c.Check(rest, check.HasLen, 0)
    86  	c.Check(s.Stderr(), check.Equals, "")
    87  	c.Check(s.Stdout(), check.Equals, "No warnings.\n")
    88  }
    89  
    90  func (s *warningSuite) TestNoFurtherWarnings(c *check.C) {
    91  	snap.WriteWarningTimestamp(time.Now())
    92  
    93  	s.RedirectClientToTestServer(mkWarningsFakeHandler(c, `{"type": "sync", "status-code": 200, "result": []}`))
    94  
    95  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"warnings", "--abs-time"})
    96  	c.Assert(err, check.IsNil)
    97  	c.Check(rest, check.HasLen, 0)
    98  	c.Check(s.Stderr(), check.Equals, "")
    99  	c.Check(s.Stdout(), check.Equals, "No further warnings.\n")
   100  }
   101  
   102  func (s *warningSuite) TestWarnings(c *check.C) {
   103  	s.RedirectClientToTestServer(mkWarningsFakeHandler(c, twoWarnings))
   104  
   105  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"warnings", "--abs-time", "--unicode=never"})
   106  	c.Assert(err, check.IsNil)
   107  	c.Check(rest, check.HasLen, 0)
   108  	c.Check(s.Stderr(), check.Equals, "")
   109  	c.Check(s.Stdout(), check.Equals, `
   110  last-occurrence:  2018-09-19T12:41:18Z
   111  warning: |
   112    hello world number one
   113  ---
   114  last-occurrence:  2018-09-19T12:44:19Z
   115  warning: |
   116    hello world number two
   117  `[1:])
   118  }
   119  
   120  func (s *warningSuite) TestVerboseWarnings(c *check.C) {
   121  	s.RedirectClientToTestServer(mkWarningsFakeHandler(c, twoWarnings))
   122  
   123  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"warnings", "--abs-time", "--verbose", "--unicode=never"})
   124  	c.Assert(err, check.IsNil)
   125  	c.Check(rest, check.HasLen, 0)
   126  	c.Check(s.Stderr(), check.Equals, "")
   127  	c.Check(s.Stdout(), check.Equals, `
   128  first-occurrence:  2018-09-19T12:41:18Z
   129  last-occurrence:   2018-09-19T12:41:18Z
   130  acknowledged:      --
   131  repeats-after:     1d00h
   132  expires-after:     28d0h
   133  warning: |
   134    hello world number one
   135  ---
   136  first-occurrence:  2018-09-19T12:44:19Z
   137  last-occurrence:   2018-09-19T12:44:19Z
   138  acknowledged:      --
   139  repeats-after:     1d00h
   140  expires-after:     28d0h
   141  warning: |
   142    hello world number two
   143  `[1:])
   144  }
   145  
   146  func (s *warningSuite) TestOkay(c *check.C) {
   147  	t0 := time.Now()
   148  	snap.WriteWarningTimestamp(t0)
   149  
   150  	var n int
   151  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   152  		n++
   153  		if n != 1 {
   154  			c.Fatalf("expected 1 request, now on %d", n)
   155  		}
   156  		c.Check(r.URL.Path, check.Equals, "/v2/warnings")
   157  		c.Check(r.URL.Query(), check.HasLen, 0)
   158  		c.Assert(DecodedRequestBody(c, r), check.DeepEquals, map[string]interface{}{"action": "okay", "timestamp": t0.Format(time.RFC3339Nano)})
   159  		c.Check(r.Method, check.Equals, "POST")
   160  		w.WriteHeader(200)
   161  		fmt.Fprintln(w, `{
   162  			"status": "OK",
   163  			"status-code": 200,
   164  			"type": "sync"
   165  		}`)
   166  	})
   167  
   168  	rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"okay"})
   169  	c.Assert(err, check.IsNil)
   170  	c.Check(rest, check.HasLen, 0)
   171  	c.Check(s.Stderr(), check.Equals, "")
   172  	c.Check(s.Stdout(), check.Equals, "")
   173  }
   174  
   175  func (s *warningSuite) TestOkayBeforeWarnings(c *check.C) {
   176  	_, err := snap.Parser(snap.Client()).ParseArgs([]string{"okay"})
   177  	c.Assert(err, check.ErrorMatches, "you must have looked at the warnings before acknowledging them. Try 'snap warnings'.")
   178  	c.Check(s.Stderr(), check.Equals, "")
   179  	c.Check(s.Stdout(), check.Equals, "")
   180  }
   181  
   182  func (s *warningSuite) TestListWithWarnings(c *check.C) {
   183  	var called bool
   184  	s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) {
   185  		if called {
   186  			c.Fatalf("expected a single request")
   187  		}
   188  		called = true
   189  		c.Check(r.URL.Path, check.Equals, "/v2/snaps")
   190  		c.Check(r.URL.Query(), check.HasLen, 0)
   191  
   192  		buf, err := ioutil.ReadAll(r.Body)
   193  		c.Assert(err, check.IsNil)
   194  		c.Check(string(buf), check.Equals, "")
   195  		c.Check(r.Method, check.Equals, "GET")
   196  		w.WriteHeader(200)
   197  		fmt.Fprintln(w, `{
   198  				"result": [{}],
   199  				"status": "OK",
   200  				"status-code": 200,
   201  				"type": "sync",
   202  				"warning-count": 2,
   203  				"warning-timestamp": "2018-09-19T12:44:19.680362867Z"
   204  			}`)
   205  	})
   206  	cli := snap.Client()
   207  	rest, err := snap.Parser(cli).ParseArgs([]string{"list"})
   208  	c.Assert(err, check.IsNil)
   209  
   210  	{
   211  		// TODO: I hope to get to refactor run() so we can
   212  		// call it from tests and not have to do this (whole
   213  		// block) by hand
   214  
   215  		count, stamp := cli.WarningsSummary()
   216  		c.Check(count, check.Equals, 2)
   217  		c.Check(stamp, check.Equals, time.Date(2018, 9, 19, 12, 44, 19, 680362867, time.UTC))
   218  
   219  		snap.MaybePresentWarnings(count, stamp)
   220  	}
   221  
   222  	c.Check(rest, check.HasLen, 0)
   223  	c.Check(s.Stdout(), check.Equals, `
   224  Name  Version  Rev    Tracking  Publisher  Notes
   225                 unset  -         -          disabled
   226  `[1:])
   227  	c.Check(s.Stderr(), check.Equals, "WARNING: There are 2 new warnings. See 'snap warnings'.\n")
   228  
   229  }