github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/juju-log_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Copyright 2014 Cloudbase Solutions SRL
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package jujuc_test
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"github.com/juju/cmd/v3"
    11  	"github.com/juju/cmd/v3/cmdtesting"
    12  	"github.com/juju/errors"
    13  	"github.com/juju/loggo"
    14  	jc "github.com/juju/testing/checkers"
    15  	"go.uber.org/mock/gomock"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    19  	"github.com/juju/juju/worker/uniter/runner/jujuc/mocks"
    20  )
    21  
    22  type JujuLogSuite struct {
    23  	relationSuite
    24  }
    25  
    26  var _ = gc.Suite(&JujuLogSuite{})
    27  
    28  func (s *JujuLogSuite) newJujuLogCommand(c *gc.C) cmd.Command {
    29  	ctx, _ := s.newHookContext(-1, "", "")
    30  	cmd, err := jujuc.NewJujuLogCommand(ctx)
    31  	c.Assert(err, jc.ErrorIsNil)
    32  	return jujuc.NewJujucCommandWrappedForTest(cmd)
    33  }
    34  
    35  func (s *JujuLogSuite) newJujuLogCommandWithMocks(ctrl *gomock.Controller, name string) (cmd.Command, *mocks.MockJujuLogContext, *loggo.TestWriter) {
    36  	ctx := mocks.NewMockJujuLogContext(ctrl)
    37  	moduleName := fmt.Sprintf("unit.%s.juju-log", name)
    38  	logCtx := loggo.NewContext(loggo.UNSPECIFIED)
    39  	testWriter := &loggo.TestWriter{}
    40  	logCtx.AddWriter("test", testWriter)
    41  	ctx.EXPECT().GetLogger(moduleName).Return(logCtx.GetLogger(moduleName))
    42  
    43  	cmd := jujuc.NewJujuLogCommandWithMocks(ctx)
    44  	return jujuc.NewJujucCommandWrappedForTest(cmd), ctx, testWriter
    45  }
    46  
    47  func (s *JujuLogSuite) TestRequiresMessage(c *gc.C) {
    48  	cmd := s.newJujuLogCommand(c)
    49  	err := cmdtesting.InitCommand(cmd, []string{})
    50  	c.Assert(err, gc.ErrorMatches, "no message specified")
    51  }
    52  
    53  func (s *JujuLogSuite) TestLogInitMissingLevel(c *gc.C) {
    54  	cmd := s.newJujuLogCommand(c)
    55  	err := cmdtesting.InitCommand(cmd, []string{"-l"})
    56  	c.Assert(err, gc.ErrorMatches, "option needs an argument.*")
    57  
    58  	err = cmdtesting.InitCommand(cmd, []string{"--log-level"})
    59  	c.Assert(err, gc.ErrorMatches, "option needs an argument.*")
    60  }
    61  
    62  func (s *JujuLogSuite) TestLogInitMissingMessage(c *gc.C) {
    63  	cmd := s.newJujuLogCommand(c)
    64  	err := cmdtesting.InitCommand(cmd, []string{"-l", "FATAL"})
    65  	c.Assert(err, gc.ErrorMatches, "no message specified")
    66  
    67  	err = cmdtesting.InitCommand(cmd, []string{"--log-level", "FATAL"})
    68  	c.Assert(err, gc.ErrorMatches, "no message specified")
    69  }
    70  
    71  func (s *JujuLogSuite) TestLogDeprecation(c *gc.C) {
    72  	cmd := s.newJujuLogCommand(c)
    73  	ctx, err := cmdtesting.RunCommand(c, cmd, "--format", "foo", "msg")
    74  	c.Assert(err, jc.ErrorIsNil)
    75  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "--format flag deprecated for command \"juju-log\"")
    76  }
    77  
    78  func (s *JujuLogSuite) TestRunWithNoErrorsLogsOnRun(c *gc.C) {
    79  	ctrl := gomock.NewController(c)
    80  	defer ctrl.Finish()
    81  
    82  	messages := []string{"foo", "msg"}
    83  	cmd, context, _ := s.newJujuLogCommandWithMocks(ctrl, "")
    84  
    85  	relation := mocks.NewMockContextRelation(ctrl)
    86  	relation.EXPECT().FakeId().Return("")
    87  
    88  	context.EXPECT().HookRelation().Return(relation, nil)
    89  	context.EXPECT().UnitName().Return("")
    90  
    91  	ctx, err := cmdtesting.RunCommand(c, cmd, messages...)
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "")
    94  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
    95  }
    96  
    97  func (s *JujuLogSuite) TestRunWithErrorIsNotImplementedLogsOnRun(c *gc.C) {
    98  	ctrl := gomock.NewController(c)
    99  	defer ctrl.Finish()
   100  
   101  	messages := []string{"foo", "msg"}
   102  	cmd, context, _ := s.newJujuLogCommandWithMocks(ctrl, "")
   103  
   104  	context.EXPECT().HookRelation().Return(nil, errors.NotImplementedf("not implemented"))
   105  	context.EXPECT().UnitName().Return("")
   106  
   107  	ctx, err := cmdtesting.RunCommand(c, cmd, messages...)
   108  	c.Assert(err, jc.ErrorIsNil)
   109  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "")
   110  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   111  }
   112  
   113  func (s *JujuLogSuite) TestRunWithErrorIsNotFoundLogsOnRun(c *gc.C) {
   114  	ctrl := gomock.NewController(c)
   115  	defer ctrl.Finish()
   116  
   117  	messages := []string{"foo", "msg"}
   118  	cmd, context, _ := s.newJujuLogCommandWithMocks(ctrl, "")
   119  
   120  	context.EXPECT().HookRelation().Return(nil, errors.NotFoundf("not found"))
   121  	context.EXPECT().UnitName().Return("")
   122  
   123  	ctx, err := cmdtesting.RunCommand(c, cmd, messages...)
   124  	c.Assert(err, jc.ErrorIsNil)
   125  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "")
   126  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   127  }
   128  
   129  func (s *JujuLogSuite) TestRunWithErrorDoesNotLogOnRun(c *gc.C) {
   130  	ctrl := gomock.NewController(c)
   131  	defer ctrl.Finish()
   132  
   133  	messages := []string{"foo", "msg"}
   134  
   135  	cmd, context, _ := s.newJujuLogCommandWithMocks(ctrl, "")
   136  
   137  	context.EXPECT().HookRelation().Return(nil, errors.New("bad"))
   138  	context.EXPECT().UnitName().Return("")
   139  
   140  	ctx, err := cmdtesting.RunCommand(c, cmd, messages...)
   141  	c.Assert(errors.Cause(err), gc.ErrorMatches, "bad")
   142  	c.Assert(cmdtesting.Stderr(ctx), gc.Equals, "")
   143  	c.Assert(cmdtesting.Stdout(ctx), gc.Equals, "")
   144  }