github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/remoterelations/mock_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package remoterelations_test
     5  
     6  import (
     7  	"sync"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	"gopkg.in/juju/names.v2"
    12  	"gopkg.in/macaroon.v2-unstable"
    13  	"gopkg.in/tomb.v2"
    14  
    15  	"github.com/juju/juju/api"
    16  	apitesting "github.com/juju/juju/api/testing"
    17  	"github.com/juju/juju/apiserver/common"
    18  	"github.com/juju/juju/apiserver/params"
    19  	"github.com/juju/juju/core/status"
    20  	"github.com/juju/juju/core/watcher"
    21  	"github.com/juju/juju/worker/remoterelations"
    22  )
    23  
    24  type mockRelationsFacade struct {
    25  	mu   sync.Mutex
    26  	stub *testing.Stub
    27  	remoterelations.RemoteRelationsFacade
    28  	remoteApplicationsWatcher          *mockStringsWatcher
    29  	remoteApplicationRelationsWatchers map[string]*mockStringsWatcher
    30  	remoteApplications                 map[string]*mockRemoteApplication
    31  	relations                          map[string]*mockRelation
    32  	relationsEndpoints                 map[string]*relationEndpointInfo
    33  	relationsUnitsWatchers             map[string]*mockRelationUnitsWatcher
    34  	controllerInfo                     map[string]*api.Info
    35  }
    36  
    37  func newMockRelationsFacade(stub *testing.Stub) *mockRelationsFacade {
    38  	return &mockRelationsFacade{
    39  		stub:                               stub,
    40  		remoteApplications:                 make(map[string]*mockRemoteApplication),
    41  		relations:                          make(map[string]*mockRelation),
    42  		relationsEndpoints:                 make(map[string]*relationEndpointInfo),
    43  		remoteApplicationsWatcher:          newMockStringsWatcher(),
    44  		remoteApplicationRelationsWatchers: make(map[string]*mockStringsWatcher),
    45  		relationsUnitsWatchers:             make(map[string]*mockRelationUnitsWatcher),
    46  		controllerInfo:                     make(map[string]*api.Info),
    47  	}
    48  }
    49  
    50  func (m *mockRelationsFacade) WatchRemoteApplications() (watcher.StringsWatcher, error) {
    51  	m.mu.Lock()
    52  	defer m.mu.Unlock()
    53  	m.stub.MethodCall(m, "WatchRemoteApplications")
    54  	if err := m.stub.NextErr(); err != nil {
    55  		return nil, err
    56  	}
    57  	return m.remoteApplicationsWatcher, nil
    58  }
    59  
    60  func (m *mockRelationsFacade) remoteApplicationRelationsWatcher(name string) (*mockStringsWatcher, bool) {
    61  	m.mu.Lock()
    62  	defer m.mu.Unlock()
    63  	w, ok := m.remoteApplicationRelationsWatchers[name]
    64  	return w, ok
    65  }
    66  
    67  func (m *mockRelationsFacade) removeApplication(name string) (*mockStringsWatcher, bool) {
    68  	m.mu.Lock()
    69  	defer m.mu.Unlock()
    70  	w, ok := m.remoteApplicationRelationsWatchers[name]
    71  	delete(m.remoteApplications, name)
    72  	return w, ok
    73  }
    74  
    75  func (m *mockRelationsFacade) relationsUnitsWatcher(key string) (*mockRelationUnitsWatcher, bool) {
    76  	m.mu.Lock()
    77  	defer m.mu.Unlock()
    78  	w, ok := m.relationsUnitsWatchers[key]
    79  	return w, ok
    80  }
    81  
    82  func (m *mockRelationsFacade) removeRelation(key string) (*mockRelationUnitsWatcher, bool) {
    83  	m.mu.Lock()
    84  	defer m.mu.Unlock()
    85  	w, ok := m.relationsUnitsWatchers[key]
    86  	delete(m.relations, key)
    87  	return w, ok
    88  }
    89  
    90  func (m *mockRelationsFacade) updateRelationLife(key string, life params.Life) (*mockRelationUnitsWatcher, bool) {
    91  	m.mu.Lock()
    92  	defer m.mu.Unlock()
    93  	w, ok := m.relationsUnitsWatchers[key]
    94  	m.relations[key].life = life
    95  	return w, ok
    96  }
    97  
    98  func (m *mockRelationsFacade) WatchRemoteApplicationRelations(application string) (watcher.StringsWatcher, error) {
    99  	m.mu.Lock()
   100  	defer m.mu.Unlock()
   101  	m.stub.MethodCall(m, "WatchRemoteApplicationRelations", application)
   102  	if err := m.stub.NextErr(); err != nil {
   103  		return nil, err
   104  	}
   105  	m.remoteApplicationRelationsWatchers[application] = newMockStringsWatcher()
   106  	return m.remoteApplicationRelationsWatchers[application], nil
   107  }
   108  
   109  func (m *mockRelationsFacade) ExportEntities(entities []names.Tag) ([]params.TokenResult, error) {
   110  	m.stub.MethodCall(m, "ExportEntities", entities)
   111  	if err := m.stub.NextErr(); err != nil {
   112  		return nil, err
   113  	}
   114  	result := make([]params.TokenResult, len(entities))
   115  	for i, e := range entities {
   116  		result[i] = params.TokenResult{
   117  			Token: "token-" + e.Id(),
   118  		}
   119  	}
   120  	return result, nil
   121  }
   122  
   123  func (m *mockRelationsFacade) ImportRemoteEntity(entity names.Tag, token string) error {
   124  	m.stub.MethodCall(m, "ImportRemoteEntity", entity, token)
   125  	return m.stub.NextErr()
   126  }
   127  
   128  func (m *mockRelationsFacade) SaveMacaroon(entity names.Tag, mac *macaroon.Macaroon) error {
   129  	m.stub.MethodCall(m, "SaveMacaroon", entity, mac)
   130  	return m.stub.NextErr()
   131  }
   132  
   133  func (m *mockRelationsFacade) GetToken(entity names.Tag) (string, error) {
   134  	m.stub.MethodCall(m, "GetToken", entity)
   135  	if err := m.stub.NextErr(); err != nil {
   136  		return "", err
   137  	}
   138  	return "token-" + entity.Id(), nil
   139  }
   140  
   141  func (m *mockRelationsFacade) RelationUnitSettings(relationUnits []params.RelationUnit) ([]params.SettingsResult, error) {
   142  	m.stub.MethodCall(m, "RelationUnitSettings", relationUnits)
   143  	if err := m.stub.NextErr(); err != nil {
   144  		return nil, err
   145  	}
   146  	result := make([]params.SettingsResult, len(relationUnits))
   147  	for i := range relationUnits {
   148  		result[i].Settings = map[string]string{
   149  			"foo": "bar",
   150  		}
   151  	}
   152  	return result, nil
   153  }
   154  
   155  func (m *mockRelationsFacade) RemoteApplications(names []string) ([]params.RemoteApplicationResult, error) {
   156  	m.mu.Lock()
   157  	defer m.mu.Unlock()
   158  	m.stub.MethodCall(m, "RemoteApplications", names)
   159  	if err := m.stub.NextErr(); err != nil {
   160  		return nil, err
   161  	}
   162  	mac, err := apitesting.NewMacaroon("test")
   163  	if err != nil {
   164  		return nil, err
   165  	}
   166  	result := make([]params.RemoteApplicationResult, len(names))
   167  	for i, name := range names {
   168  		if app, ok := m.remoteApplications[name]; ok {
   169  			result[i] = params.RemoteApplicationResult{
   170  				Result: &params.RemoteApplication{
   171  					Name:            app.name,
   172  					OfferUUID:       app.offeruuid,
   173  					Life:            app.life,
   174  					ModelUUID:       app.modelUUID,
   175  					IsConsumerProxy: app.registered,
   176  					Macaroon:        mac,
   177  				},
   178  			}
   179  		} else {
   180  			result[i] = params.RemoteApplicationResult{
   181  				Error: common.ServerError(errors.NotFoundf(name))}
   182  		}
   183  	}
   184  	return result, nil
   185  }
   186  
   187  type relationEndpointInfo struct {
   188  	localApplicationName string
   189  	localEndpoint        params.RemoteEndpoint
   190  	remoteEndpointName   string
   191  }
   192  
   193  func (m *mockRelationsFacade) Relations(keys []string) ([]params.RemoteRelationResult, error) {
   194  	m.mu.Lock()
   195  	defer m.mu.Unlock()
   196  	m.stub.MethodCall(m, "Relations", keys)
   197  	if err := m.stub.NextErr(); err != nil {
   198  		return nil, err
   199  	}
   200  	result := make([]params.RemoteRelationResult, len(keys))
   201  	for i, key := range keys {
   202  		if rel, ok := m.relations[key]; ok {
   203  			result[i].Result = &params.RemoteRelation{
   204  				Id:        rel.id,
   205  				Life:      rel.life,
   206  				Suspended: rel.Suspended(),
   207  				Key:       keys[i],
   208  			}
   209  			if epInfo, ok := m.relationsEndpoints[key]; ok {
   210  				result[i].Result.RemoteEndpointName = epInfo.remoteEndpointName
   211  				result[i].Result.Endpoint = epInfo.localEndpoint
   212  				result[i].Result.ApplicationName = epInfo.localApplicationName
   213  			}
   214  		} else {
   215  			result[i].Error = common.ServerError(errors.NotFoundf(key))
   216  		}
   217  	}
   218  	return result, nil
   219  }
   220  
   221  func (m *mockRelationsFacade) WatchLocalRelationUnits(relationKey string) (watcher.RelationUnitsWatcher, error) {
   222  	m.mu.Lock()
   223  	defer m.mu.Unlock()
   224  	m.stub.MethodCall(m, "WatchLocalRelationUnits", relationKey)
   225  	if err := m.stub.NextErr(); err != nil {
   226  		return nil, err
   227  	}
   228  	m.relationsUnitsWatchers[relationKey] = newMockRelationUnitsWatcher()
   229  	return m.relationsUnitsWatchers[relationKey], nil
   230  }
   231  
   232  func (m *mockRelationsFacade) ConsumeRemoteRelationChange(change params.RemoteRelationChangeEvent) error {
   233  	m.stub.MethodCall(m, "ConsumeRemoteRelationChange", change)
   234  	if err := m.stub.NextErr(); err != nil {
   235  		return err
   236  	}
   237  	return nil
   238  }
   239  
   240  func (m *mockRelationsFacade) ControllerAPIInfoForModel(modelUUID string) (*api.Info, error) {
   241  	m.stub.MethodCall(m, "ControllerAPIInfoForModel", modelUUID)
   242  	if err := m.stub.NextErr(); err != nil {
   243  		return nil, err
   244  	}
   245  	return m.controllerInfo[modelUUID], nil
   246  }
   247  
   248  func (m *mockRelationsFacade) SetRemoteApplicationStatus(applicationName string, status status.Status, message string) error {
   249  	m.stub.MethodCall(m, "SetRemoteApplicationStatus", applicationName, status.String(), message)
   250  	return nil
   251  }
   252  
   253  type mockRemoteRelationsFacade struct {
   254  	mu   sync.Mutex
   255  	stub *testing.Stub
   256  	remoterelations.RemoteModelRelationsFacadeCloser
   257  	relationsUnitsWatchers  map[string]*mockRelationUnitsWatcher
   258  	relationsStatusWatchers map[string]*mockRelationStatusWatcher
   259  	offersStatusWatchers    map[string]*mockOfferStatusWatcher
   260  }
   261  
   262  func newMockRemoteRelationsFacade(stub *testing.Stub) *mockRemoteRelationsFacade {
   263  	return &mockRemoteRelationsFacade{
   264  		stub:                    stub,
   265  		relationsUnitsWatchers:  make(map[string]*mockRelationUnitsWatcher),
   266  		relationsStatusWatchers: make(map[string]*mockRelationStatusWatcher),
   267  		offersStatusWatchers:    make(map[string]*mockOfferStatusWatcher),
   268  	}
   269  }
   270  
   271  func (m *mockRemoteRelationsFacade) Close() error {
   272  	m.stub.MethodCall(m, "Close")
   273  	return nil
   274  }
   275  
   276  func (m *mockRemoteRelationsFacade) PublishRelationChange(change params.RemoteRelationChangeEvent) error {
   277  	m.stub.MethodCall(m, "PublishRelationChange", change)
   278  	if err := m.stub.NextErr(); err != nil {
   279  		return err
   280  	}
   281  	return nil
   282  }
   283  
   284  func (m *mockRemoteRelationsFacade) RegisterRemoteRelations(relations ...params.RegisterRemoteRelationArg) ([]params.RegisterRemoteRelationResult, error) {
   285  	m.stub.MethodCall(m, "RegisterRemoteRelations", relations)
   286  	if err := m.stub.NextErr(); err != nil {
   287  		return nil, err
   288  	}
   289  	result := make([]params.RegisterRemoteRelationResult, len(relations))
   290  	mac, err := apitesting.NewMacaroon("apimac")
   291  	if err != nil {
   292  		return nil, err
   293  	}
   294  	for i, rel := range relations {
   295  		result[i].Result = &params.RemoteRelationDetails{
   296  			Token:    "token-" + rel.OfferUUID,
   297  			Macaroon: mac,
   298  		}
   299  	}
   300  	return result, nil
   301  }
   302  
   303  func (m *mockRemoteRelationsFacade) relationsUnitsWatcher(key string) (*mockRelationUnitsWatcher, bool) {
   304  	m.mu.Lock()
   305  	defer m.mu.Unlock()
   306  	w, ok := m.relationsUnitsWatchers[key]
   307  	return w, ok
   308  }
   309  
   310  func (m *mockRemoteRelationsFacade) WatchRelationUnits(arg params.RemoteEntityArg) (watcher.RelationUnitsWatcher, error) {
   311  	m.mu.Lock()
   312  	defer m.mu.Unlock()
   313  	m.stub.MethodCall(m, "WatchRelationUnits", arg.Token, arg.Macaroons)
   314  	if err := m.stub.NextErr(); err != nil {
   315  		return nil, err
   316  	}
   317  	m.relationsUnitsWatchers[arg.Token] = newMockRelationUnitsWatcher()
   318  	return m.relationsUnitsWatchers[arg.Token], nil
   319  }
   320  
   321  func (m *mockRemoteRelationsFacade) relationsStatusWatcher(key string) (*mockRelationStatusWatcher, bool) {
   322  	m.mu.Lock()
   323  	defer m.mu.Unlock()
   324  	w, ok := m.relationsStatusWatchers[key]
   325  	return w, ok
   326  }
   327  
   328  func (m *mockRemoteRelationsFacade) WatchRelationSuspendedStatus(arg params.RemoteEntityArg) (watcher.RelationStatusWatcher, error) {
   329  	m.mu.Lock()
   330  	defer m.mu.Unlock()
   331  	m.stub.MethodCall(m, "WatchRelationSuspendedStatus", arg.Token, arg.Macaroons)
   332  	if err := m.stub.NextErr(); err != nil {
   333  		return nil, err
   334  	}
   335  	m.relationsStatusWatchers[arg.Token] = newMockRelationStatusWatcher()
   336  	return m.relationsStatusWatchers[arg.Token], nil
   337  }
   338  
   339  func (m *mockRemoteRelationsFacade) WatchOfferStatus(arg params.OfferArg) (watcher.OfferStatusWatcher, error) {
   340  	m.mu.Lock()
   341  	defer m.mu.Unlock()
   342  	m.stub.MethodCall(m, "WatchOfferStatus", arg.OfferUUID, arg.Macaroons)
   343  	if err := m.stub.NextErr(); err != nil {
   344  		return nil, err
   345  	}
   346  	m.offersStatusWatchers[arg.OfferUUID] = newMockOfferStatusWatcher()
   347  	return m.offersStatusWatchers[arg.OfferUUID], nil
   348  }
   349  
   350  // RelationUnitSettings returns the relation unit settings for the given relation units in the remote model.
   351  func (m *mockRemoteRelationsFacade) RelationUnitSettings(relationUnits []params.RemoteRelationUnit) ([]params.SettingsResult, error) {
   352  	m.mu.Lock()
   353  	defer m.mu.Unlock()
   354  	m.stub.MethodCall(m, "RelationUnitSettings", relationUnits)
   355  	if err := m.stub.NextErr(); err != nil {
   356  		return nil, err
   357  	}
   358  	result := make([]params.SettingsResult, len(relationUnits))
   359  	for i := range relationUnits {
   360  		result[i].Settings = map[string]string{
   361  			"foo": "bar",
   362  		}
   363  	}
   364  	return result, nil
   365  }
   366  
   367  type mockWatcher struct {
   368  	testing.Stub
   369  	tomb.Tomb
   370  	mu         sync.Mutex
   371  	terminated bool
   372  }
   373  
   374  func (w *mockWatcher) killed() bool {
   375  	w.mu.Lock()
   376  	defer w.mu.Unlock()
   377  	return w.terminated
   378  }
   379  
   380  func (w *mockWatcher) Kill() {
   381  	w.MethodCall(w, "Kill")
   382  	w.Tomb.Kill(nil)
   383  	w.mu.Lock()
   384  	defer w.mu.Unlock()
   385  	w.terminated = true
   386  }
   387  
   388  func (w *mockWatcher) Stop() error {
   389  	w.MethodCall(w, "Stop")
   390  	if err := w.NextErr(); err != nil {
   391  		return err
   392  	}
   393  	w.Tomb.Kill(nil)
   394  	return w.Tomb.Wait()
   395  }
   396  
   397  type mockStringsWatcher struct {
   398  	mockWatcher
   399  	changes chan []string
   400  }
   401  
   402  func newMockStringsWatcher() *mockStringsWatcher {
   403  	w := &mockStringsWatcher{changes: make(chan []string, 5)}
   404  	w.Tomb.Go(func() error {
   405  		<-w.Tomb.Dying()
   406  		return nil
   407  	})
   408  	return w
   409  }
   410  
   411  func (w *mockStringsWatcher) Changes() watcher.StringsChannel {
   412  	w.MethodCall(w, "Changes")
   413  	return w.changes
   414  }
   415  
   416  type mockRemoteApplication struct {
   417  	testing.Stub
   418  	name       string
   419  	offeruuid  string
   420  	url        string
   421  	life       params.Life
   422  	modelUUID  string
   423  	registered bool
   424  }
   425  
   426  type mockRelationUnitsWatcher struct {
   427  	mockWatcher
   428  	changes chan watcher.RelationUnitsChange
   429  }
   430  
   431  func newMockRelationUnitsWatcher() *mockRelationUnitsWatcher {
   432  	w := &mockRelationUnitsWatcher{
   433  		changes: make(chan watcher.RelationUnitsChange, 1),
   434  	}
   435  	w.Tomb.Go(func() error {
   436  		<-w.Tomb.Dying()
   437  		return nil
   438  	})
   439  	return w
   440  }
   441  
   442  func (w *mockRelationUnitsWatcher) Changes() watcher.RelationUnitsChannel {
   443  	w.MethodCall(w, "Changes")
   444  	return w.changes
   445  }
   446  
   447  type mockRelationStatusWatcher struct {
   448  	mockWatcher
   449  	changes chan []watcher.RelationStatusChange
   450  }
   451  
   452  func newMockRelationStatusWatcher() *mockRelationStatusWatcher {
   453  	w := &mockRelationStatusWatcher{
   454  		changes: make(chan []watcher.RelationStatusChange, 1),
   455  	}
   456  	w.Tomb.Go(func() error {
   457  		<-w.Tomb.Dying()
   458  		return nil
   459  	})
   460  	return w
   461  }
   462  
   463  func (w *mockRelationStatusWatcher) Changes() watcher.RelationStatusChannel {
   464  	w.MethodCall(w, "Changes")
   465  	return w.changes
   466  }
   467  
   468  type mockOfferStatusWatcher struct {
   469  	mockWatcher
   470  	changes chan []watcher.OfferStatusChange
   471  }
   472  
   473  func newMockOfferStatusWatcher() *mockOfferStatusWatcher {
   474  	w := &mockOfferStatusWatcher{
   475  		changes: make(chan []watcher.OfferStatusChange, 1),
   476  	}
   477  	w.Tomb.Go(func() error {
   478  		<-w.Tomb.Dying()
   479  		return nil
   480  	})
   481  	return w
   482  }
   483  
   484  func (w *mockOfferStatusWatcher) Changes() watcher.OfferStatusChannel {
   485  	w.MethodCall(w, "Changes")
   486  	return w.changes
   487  }
   488  
   489  func newMockRemoteApplication(name, url string) *mockRemoteApplication {
   490  	return &mockRemoteApplication{
   491  		name: name, url: url, life: params.Alive, offeruuid: "offer-" + name + "-uuid",
   492  		modelUUID: "remote-model-uuid",
   493  	}
   494  }
   495  
   496  func (r *mockRemoteApplication) Name() string {
   497  	r.MethodCall(r, "Name")
   498  	return r.name
   499  }
   500  
   501  func (r *mockRemoteApplication) SourceModel() names.ModelTag {
   502  	r.MethodCall(r, "SourceModel")
   503  	return names.NewModelTag(r.modelUUID)
   504  }
   505  
   506  func (r *mockRemoteApplication) Life() params.Life {
   507  	r.MethodCall(r, "Life")
   508  	return r.life
   509  }
   510  
   511  type mockRelation struct {
   512  	testing.Stub
   513  	sync.Mutex
   514  	id        int
   515  	life      params.Life
   516  	suspended bool
   517  }
   518  
   519  func newMockRelation(id int) *mockRelation {
   520  	return &mockRelation{
   521  		id:   id,
   522  		life: params.Alive,
   523  	}
   524  }
   525  
   526  func (r *mockRelation) Id() int {
   527  	r.MethodCall(r, "Id")
   528  	return r.id
   529  }
   530  
   531  func (r *mockRelation) Life() params.Life {
   532  	r.MethodCall(r, "Life")
   533  	return r.life
   534  }
   535  
   536  func (r *mockRelation) Suspended() bool {
   537  	r.Lock()
   538  	defer r.Unlock()
   539  	r.MethodCall(r, "Suspended")
   540  	return r.suspended
   541  }
   542  
   543  func (r *mockRelation) SetSuspended(suspended bool) {
   544  	r.Lock()
   545  	defer r.Unlock()
   546  	r.suspended = suspended
   547  }