github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/controller/logfwd/lastsent_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package logfwd_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/facades/controller/logfwd"
    15  	"github.com/juju/juju/apiserver/params"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/state"
    18  )
    19  
    20  type LastSentSuite struct {
    21  	testing.IsolationSuite
    22  
    23  	stub       *testing.Stub
    24  	state      *stubState
    25  	authorizer apiservertesting.FakeAuthorizer
    26  }
    27  
    28  var _ = gc.Suite(&LastSentSuite{})
    29  
    30  func (s *LastSentSuite) SetUpTest(c *gc.C) {
    31  	s.IsolationSuite.SetUpTest(c)
    32  
    33  	s.stub = &testing.Stub{}
    34  	s.state = &stubState{stub: s.stub}
    35  	s.authorizer = apiservertesting.FakeAuthorizer{
    36  		Tag:        names.NewMachineTag("99"),
    37  		Controller: true,
    38  	}
    39  }
    40  
    41  func (s *LastSentSuite) TestAuthRefusesUser(c *gc.C) {
    42  	anAuthorizer := apiservertesting.FakeAuthorizer{
    43  		Tag: names.NewUserTag("bob"),
    44  	}
    45  
    46  	_, err := logfwd.NewLogForwardingAPI(s.state, anAuthorizer)
    47  
    48  	c.Check(err, gc.ErrorMatches, "permission denied")
    49  }
    50  
    51  func (s *LastSentSuite) TestAuthRefusesNonController(c *gc.C) {
    52  	anAuthorizer := apiservertesting.FakeAuthorizer{
    53  		Tag: names.NewMachineTag("99"),
    54  	}
    55  
    56  	_, err := logfwd.NewLogForwardingAPI(s.state, anAuthorizer)
    57  
    58  	c.Check(err, gc.ErrorMatches, "permission denied")
    59  }
    60  
    61  func (s *LastSentSuite) TestGetLastSentOne(c *gc.C) {
    62  	tracker := s.state.addTracker()
    63  	tracker.ReturnGet = 10
    64  	api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer)
    65  	c.Assert(err, jc.ErrorIsNil)
    66  	model := "deadbeef-2f18-4fd2-967d-db9663db7bea"
    67  	modelTag := names.NewModelTag(model)
    68  
    69  	res := api.GetLastSent(params.LogForwardingGetLastSentParams{
    70  		IDs: []params.LogForwardingID{{
    71  			ModelTag: modelTag.String(),
    72  			Sink:     "spam",
    73  		}},
    74  	})
    75  
    76  	c.Check(res, jc.DeepEquals, params.LogForwardingGetLastSentResults{
    77  		Results: []params.LogForwardingGetLastSentResult{{
    78  			RecordID:        10,
    79  			RecordTimestamp: 100,
    80  		}},
    81  	})
    82  	s.stub.CheckCallNames(c, "NewLastSentTracker", "Get", "Close")
    83  	s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam")
    84  }
    85  
    86  func (s *LastSentSuite) TestGetLastSentBulk(c *gc.C) {
    87  	trackerSpam := s.state.addTracker()
    88  	trackerSpam.ReturnGet = 10
    89  	trackerEggs := s.state.addTracker()
    90  	trackerEggs.ReturnGet = 20
    91  	s.state.addTracker() // ham
    92  	s.stub.SetErrors(nil, nil, nil, nil, state.ErrNeverForwarded)
    93  	api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	model := "deadbeef-2f18-4fd2-967d-db9663db7bea"
    96  	modelTag := names.NewModelTag(model)
    97  
    98  	res := api.GetLastSent(params.LogForwardingGetLastSentParams{
    99  		IDs: []params.LogForwardingID{{
   100  			ModelTag: modelTag.String(),
   101  			Sink:     "spam",
   102  		}, {
   103  			ModelTag: modelTag.String(),
   104  			Sink:     "eggs",
   105  		}, {
   106  			ModelTag: modelTag.String(),
   107  			Sink:     "ham",
   108  		}},
   109  	})
   110  
   111  	c.Check(res, jc.DeepEquals, params.LogForwardingGetLastSentResults{
   112  		Results: []params.LogForwardingGetLastSentResult{{
   113  			RecordID:        10,
   114  			RecordTimestamp: 100,
   115  		}, {
   116  			RecordID:        20,
   117  			RecordTimestamp: 200,
   118  		}, {
   119  			Error: &params.Error{
   120  				Message: `cannot find ID of the last forwarded record`,
   121  				Code:    params.CodeNotFound,
   122  			},
   123  		}},
   124  	})
   125  	s.stub.CheckCallNames(c,
   126  		"NewLastSentTracker", "Get", "Close",
   127  		"NewLastSentTracker", "Get", "Close",
   128  		"NewLastSentTracker", "Get", "Close",
   129  	)
   130  	s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam")
   131  	s.stub.CheckCall(c, 3, "NewLastSentTracker", modelTag, "eggs")
   132  	s.stub.CheckCall(c, 6, "NewLastSentTracker", modelTag, "ham")
   133  }
   134  
   135  func (s *LastSentSuite) TestSetLastSentOne(c *gc.C) {
   136  	s.state.addTracker()
   137  	api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer)
   138  	c.Assert(err, jc.ErrorIsNil)
   139  	model := "deadbeef-2f18-4fd2-967d-db9663db7bea"
   140  	modelTag := names.NewModelTag(model)
   141  
   142  	res := api.SetLastSent(params.LogForwardingSetLastSentParams{
   143  		Params: []params.LogForwardingSetLastSentParam{{
   144  			LogForwardingID: params.LogForwardingID{
   145  				ModelTag: modelTag.String(),
   146  				Sink:     "spam",
   147  			},
   148  			RecordID:        10,
   149  			RecordTimestamp: 100,
   150  		}},
   151  	})
   152  
   153  	c.Check(res, jc.DeepEquals, params.ErrorResults{
   154  		Results: []params.ErrorResult{{
   155  			Error: nil,
   156  		}},
   157  	})
   158  	s.stub.CheckCallNames(c, "NewLastSentTracker", "Set", "Close")
   159  	s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam")
   160  	s.stub.CheckCall(c, 1, "Set", int64(10), int64(100))
   161  }
   162  
   163  func (s *LastSentSuite) TestSetLastSentBulk(c *gc.C) {
   164  	s.state.addTracker() // spam
   165  	s.state.addTracker() // eggs
   166  	s.state.addTracker() // ham
   167  	failure := errors.New("<failed>")
   168  	s.stub.SetErrors(nil, nil, failure)
   169  	api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer)
   170  	c.Assert(err, jc.ErrorIsNil)
   171  	model := "deadbeef-2f18-4fd2-967d-db9663db7bea"
   172  	modelTag := names.NewModelTag(model)
   173  
   174  	res := api.SetLastSent(params.LogForwardingSetLastSentParams{
   175  		Params: []params.LogForwardingSetLastSentParam{{
   176  			LogForwardingID: params.LogForwardingID{
   177  				ModelTag: modelTag.String(),
   178  				Sink:     "spam",
   179  			},
   180  			RecordID:        10,
   181  			RecordTimestamp: 100,
   182  		}, {
   183  			LogForwardingID: params.LogForwardingID{
   184  				ModelTag: modelTag.String(),
   185  				Sink:     "eggs",
   186  			},
   187  			RecordID:        20,
   188  			RecordTimestamp: 200,
   189  		}, {
   190  			LogForwardingID: params.LogForwardingID{
   191  				ModelTag: modelTag.String(),
   192  				Sink:     "ham",
   193  			},
   194  			RecordID:        15,
   195  			RecordTimestamp: 150,
   196  		}},
   197  	})
   198  
   199  	c.Check(res, jc.DeepEquals, params.ErrorResults{
   200  		Results: []params.ErrorResult{{
   201  			Error: nil,
   202  		}, {
   203  			Error: common.ServerError(failure),
   204  		}, {
   205  			Error: nil,
   206  		}},
   207  	})
   208  	s.stub.CheckCallNames(c,
   209  		"NewLastSentTracker", "Set", "Close",
   210  		"NewLastSentTracker", "Set", "Close",
   211  		"NewLastSentTracker", "Set", "Close",
   212  	)
   213  	s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam")
   214  	s.stub.CheckCall(c, 1, "Set", int64(10), int64(100))
   215  	s.stub.CheckCall(c, 3, "NewLastSentTracker", modelTag, "eggs")
   216  	s.stub.CheckCall(c, 4, "Set", int64(20), int64(200))
   217  	s.stub.CheckCall(c, 6, "NewLastSentTracker", modelTag, "ham")
   218  	s.stub.CheckCall(c, 7, "Set", int64(15), int64(150))
   219  }
   220  
   221  type stubState struct {
   222  	stub *testing.Stub
   223  
   224  	ReturnNewLastSentTracker []logfwd.LastSentTracker
   225  }
   226  
   227  func (s *stubState) addTracker() *stubTracker {
   228  	tracker := &stubTracker{stub: s.stub}
   229  	s.ReturnNewLastSentTracker = append(s.ReturnNewLastSentTracker, tracker)
   230  	return tracker
   231  }
   232  
   233  func (s *stubState) NewLastSentTracker(tag names.ModelTag, sink string) logfwd.LastSentTracker {
   234  	s.stub.AddCall("NewLastSentTracker", tag, sink)
   235  	if len(s.ReturnNewLastSentTracker) == 0 {
   236  		panic("ran out of trackers")
   237  	}
   238  	tracker := s.ReturnNewLastSentTracker[0]
   239  	s.ReturnNewLastSentTracker = s.ReturnNewLastSentTracker[1:]
   240  	return tracker
   241  }
   242  
   243  type stubTracker struct {
   244  	stub *testing.Stub
   245  
   246  	ReturnGet int64
   247  }
   248  
   249  func (s *stubTracker) Get() (int64, int64, error) {
   250  	s.stub.AddCall("Get")
   251  	if err := s.stub.NextErr(); err != nil {
   252  		return 0, 0, err
   253  	}
   254  
   255  	return s.ReturnGet, s.ReturnGet * 10, nil
   256  }
   257  
   258  func (s *stubTracker) Set(recID int64, recTimestamp int64) error {
   259  	s.stub.AddCall("Set", recID, recTimestamp)
   260  	if err := s.stub.NextErr(); err != nil {
   261  		return err
   262  	}
   263  
   264  	return nil
   265  }
   266  
   267  func (s *stubTracker) Close() error {
   268  	s.stub.AddCall("Close")
   269  	if err := s.stub.NextErr(); err != nil {
   270  		return err
   271  	}
   272  
   273  	return nil
   274  }