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: ¶ms.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 = ¶ms.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 = ¶ms.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 }