github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/apiserver/common/setstatus_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"github.com/juju/juju/state"
    12  	"github.com/juju/juju/state/api/params"
    13  	"github.com/juju/juju/state/apiserver/common"
    14  	apiservertesting "github.com/juju/juju/state/apiserver/testing"
    15  )
    16  
    17  type statusSetterSuite struct{}
    18  
    19  var _ = gc.Suite(&statusSetterSuite{})
    20  
    21  type fakeStatusSetter struct {
    22  	state.Entity
    23  	status params.Status
    24  	info   string
    25  	data   params.StatusData
    26  	err    error
    27  	fetchError
    28  }
    29  
    30  func (s *fakeStatusSetter) SetStatus(status params.Status, info string, data params.StatusData) error {
    31  	s.status = status
    32  	s.info = info
    33  	s.data = data
    34  	return s.err
    35  }
    36  
    37  func (s *fakeStatusSetter) Status() (status params.Status, info string, data params.StatusData, err error) {
    38  	return s.status, s.info, s.data, nil
    39  }
    40  
    41  func (s *fakeStatusSetter) UpdateStatus(data params.StatusData) error {
    42  	for k, v := range data {
    43  		s.data[k] = v
    44  	}
    45  	return s.err
    46  }
    47  
    48  func (*statusSetterSuite) TestSetStatus(c *gc.C) {
    49  	st := &fakeState{
    50  		entities: map[string]entityWithError{
    51  			"x0": &fakeStatusSetter{status: params.StatusPending, info: "blah", err: fmt.Errorf("x0 fails")},
    52  			"x1": &fakeStatusSetter{status: params.StatusStarted, info: "foo"},
    53  			"x2": &fakeStatusSetter{status: params.StatusError, info: "some info"},
    54  			"x3": &fakeStatusSetter{fetchError: "x3 error"},
    55  			"x4": &fakeStatusSetter{status: params.StatusStopped, info: ""},
    56  		},
    57  	}
    58  	getCanModify := func() (common.AuthFunc, error) {
    59  		return func(tag string) bool {
    60  			switch tag {
    61  			case "x0", "x1", "x2", "x3":
    62  				return true
    63  			}
    64  			return false
    65  		}, nil
    66  	}
    67  	s := common.NewStatusSetter(st, getCanModify)
    68  	args := params.SetStatus{
    69  		Entities: []params.EntityStatus{
    70  			{"x0", params.StatusStarted, "bar", nil},
    71  			{"x1", params.StatusStopped, "", nil},
    72  			{"x2", params.StatusPending, "not really", nil},
    73  			{"x3", params.StatusStopped, "", nil},
    74  			{"x4", params.StatusError, "blarg", nil},
    75  			{"x5", params.StatusStarted, "42", nil},
    76  		},
    77  	}
    78  	result, err := s.SetStatus(args)
    79  	c.Assert(err, gc.IsNil)
    80  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    81  		Results: []params.ErrorResult{
    82  			{&params.Error{Message: "x0 fails"}},
    83  			{nil},
    84  			{nil},
    85  			{&params.Error{Message: "x3 error"}},
    86  			{apiservertesting.ErrUnauthorized},
    87  			{apiservertesting.ErrUnauthorized},
    88  		},
    89  	})
    90  	get := func(tag string) *fakeStatusSetter {
    91  		return st.entities[tag].(*fakeStatusSetter)
    92  	}
    93  	c.Assert(get("x1").status, gc.Equals, params.StatusStopped)
    94  	c.Assert(get("x1").info, gc.Equals, "")
    95  	c.Assert(get("x2").status, gc.Equals, params.StatusPending)
    96  	c.Assert(get("x2").info, gc.Equals, "not really")
    97  }
    98  
    99  func (*statusSetterSuite) TestSetStatusError(c *gc.C) {
   100  	getCanModify := func() (common.AuthFunc, error) {
   101  		return nil, fmt.Errorf("pow")
   102  	}
   103  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
   104  	args := params.SetStatus{
   105  		Entities: []params.EntityStatus{{"x0", "", "", nil}},
   106  	}
   107  	_, err := s.SetStatus(args)
   108  	c.Assert(err, gc.ErrorMatches, "pow")
   109  }
   110  
   111  func (*statusSetterSuite) TestSetStatusNoArgsNoError(c *gc.C) {
   112  	getCanModify := func() (common.AuthFunc, error) {
   113  		return nil, fmt.Errorf("pow")
   114  	}
   115  	s := common.NewStatusSetter(&fakeState{}, getCanModify)
   116  	result, err := s.SetStatus(params.SetStatus{})
   117  	c.Assert(err, gc.IsNil)
   118  	c.Assert(result.Results, gc.HasLen, 0)
   119  }
   120  
   121  func (*statusSetterSuite) TestUpdateStatus(c *gc.C) {
   122  	st := &fakeState{
   123  		entities: map[string]entityWithError{
   124  			"x0": &fakeStatusSetter{status: params.StatusPending, info: "blah", err: fmt.Errorf("x0 fails")},
   125  			"x1": &fakeStatusSetter{status: params.StatusError, info: "foo", data: params.StatusData{"foo": "blah"}},
   126  			"x2": &fakeStatusSetter{status: params.StatusError, info: "some info"},
   127  			"x3": &fakeStatusSetter{fetchError: "x3 error"},
   128  			"x4": &fakeStatusSetter{status: params.StatusStarted},
   129  			"x5": &fakeStatusSetter{status: params.StatusStopped, info: ""},
   130  		},
   131  	}
   132  	getCanModify := func() (common.AuthFunc, error) {
   133  		return func(tag string) bool {
   134  			switch tag {
   135  			case "x0", "x1", "x2", "x3", "x4":
   136  				return true
   137  			}
   138  			return false
   139  		}, nil
   140  	}
   141  	s := common.NewStatusSetter(st, getCanModify)
   142  	args := params.SetStatus{
   143  		Entities: []params.EntityStatus{
   144  			{Tag: "x0", Data: nil},
   145  			{Tag: "x1", Data: nil},
   146  			{Tag: "x2", Data: params.StatusData{"foo": "bar"}},
   147  			{Tag: "x3", Data: params.StatusData{"foo": "bar"}},
   148  			{Tag: "x4", Data: params.StatusData{"foo": "bar"}},
   149  			{Tag: "x5", Data: params.StatusData{"foo": "bar"}},
   150  			{Tag: "x6", Data: nil},
   151  		},
   152  	}
   153  	result, err := s.UpdateStatus(args)
   154  	c.Assert(err, gc.IsNil)
   155  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
   156  		Results: []params.ErrorResult{
   157  			{&params.Error{Message: "x0 fails"}},
   158  			{nil},
   159  			{nil},
   160  			{&params.Error{Message: "x3 error"}},
   161  			{&params.Error{Message: `machine "x4" is not in an error state`}},
   162  			{apiservertesting.ErrUnauthorized},
   163  			{apiservertesting.ErrUnauthorized},
   164  		},
   165  	})
   166  	get := func(tag string) *fakeStatusSetter {
   167  		return st.entities[tag].(*fakeStatusSetter)
   168  	}
   169  	c.Assert(get("x1").status, gc.Equals, params.StatusError)
   170  	c.Assert(get("x1").info, gc.Equals, "foo")
   171  	c.Assert(get("x1").data, gc.DeepEquals, params.StatusData{"foo": "blah"})
   172  	c.Assert(get("x2").status, gc.Equals, params.StatusError)
   173  	c.Assert(get("x2").info, gc.Equals, "some info")
   174  	c.Assert(get("x2").data, gc.DeepEquals, params.StatusData{"foo": "bar"})
   175  }