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