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 }