github.com/jasonkeene/cli@v6.14.1-0.20160816203908-ca5715166dfb+incompatible/plugin/rpc/cli_rpc_server_test.go (about) 1 package rpc_test 2 3 import ( 4 "errors" 5 "net" 6 "net/rpc" 7 "os" 8 "time" 9 10 "github.com/cloudfoundry/cli/cf" 11 "github.com/cloudfoundry/cli/cf/api" 12 "github.com/cloudfoundry/cli/cf/api/authentication/authenticationfakes" 13 "github.com/cloudfoundry/cli/cf/configuration/coreconfig" 14 "github.com/cloudfoundry/cli/cf/models" 15 "github.com/cloudfoundry/cli/cf/terminal" 16 "github.com/cloudfoundry/cli/plugin" 17 "github.com/cloudfoundry/cli/plugin/models" 18 . "github.com/cloudfoundry/cli/plugin/rpc" 19 cmdRunner "github.com/cloudfoundry/cli/plugin/rpc" 20 . "github.com/cloudfoundry/cli/plugin/rpc/fakecommand" 21 "github.com/cloudfoundry/cli/plugin/rpc/rpcfakes" 22 testconfig "github.com/cloudfoundry/cli/testhelpers/configuration" 23 . "github.com/onsi/ginkgo" 24 . "github.com/onsi/gomega" 25 ) 26 27 var _ = Describe("Server", func() { 28 29 _ = FakeCommand1{} //make sure fake_command is imported and self-registered with init() 30 31 var ( 32 err error 33 client *rpc.Client 34 rpcService *CliRpcService 35 ) 36 37 AfterEach(func() { 38 if client != nil { 39 client.Close() 40 } 41 }) 42 43 BeforeEach(func() { 44 rpc.DefaultServer = rpc.NewServer() 45 }) 46 47 Describe(".NewRpcService", func() { 48 BeforeEach(func() { 49 rpcService, err = NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 50 Expect(err).ToNot(HaveOccurred()) 51 }) 52 53 It("returns an err of another Rpc process is already registered", func() { 54 _, err := NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 55 Expect(err).To(HaveOccurred()) 56 }) 57 }) 58 59 Describe(".Stop", func() { 60 BeforeEach(func() { 61 rpcService, err = NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 62 Expect(err).ToNot(HaveOccurred()) 63 64 err := rpcService.Start() 65 Expect(err).ToNot(HaveOccurred()) 66 67 pingCli(rpcService.Port()) 68 }) 69 70 It("shuts down the rpc server", func() { 71 rpcService.Stop() 72 73 //give time for server to stop 74 time.Sleep(50 * time.Millisecond) 75 76 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 77 Expect(err).To(HaveOccurred()) 78 }) 79 }) 80 81 Describe(".Start", func() { 82 BeforeEach(func() { 83 rpcService, err = NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 84 Expect(err).ToNot(HaveOccurred()) 85 86 err := rpcService.Start() 87 Expect(err).ToNot(HaveOccurred()) 88 89 pingCli(rpcService.Port()) 90 }) 91 92 AfterEach(func() { 93 rpcService.Stop() 94 95 //give time for server to stop 96 time.Sleep(50 * time.Millisecond) 97 }) 98 99 It("Start an Rpc server for communication", func() { 100 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 101 Expect(err).ToNot(HaveOccurred()) 102 }) 103 }) 104 105 Describe(".IsMinCliVersion()", func() { 106 BeforeEach(func() { 107 rpcService, err = NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 108 Expect(err).ToNot(HaveOccurred()) 109 110 err := rpcService.Start() 111 Expect(err).ToNot(HaveOccurred()) 112 113 pingCli(rpcService.Port()) 114 115 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 116 Expect(err).ToNot(HaveOccurred()) 117 }) 118 119 AfterEach(func() { 120 rpcService.Stop() 121 122 //give time for server to stop 123 time.Sleep(50 * time.Millisecond) 124 }) 125 126 It("returns true if cli version is greater than the required version", func() { 127 cf.Version = "1.2.3+abc123" 128 129 var result bool 130 err = client.Call("CliRpcCmd.IsMinCliVersion", "1.2.2", &result) 131 Expect(err).ToNot(HaveOccurred()) 132 133 Expect(result).To(BeTrue()) 134 }) 135 136 It("returns true if cli version is equal to the required version", func() { 137 cf.Version = "1.2.3+abc123" 138 139 var result bool 140 err = client.Call("CliRpcCmd.IsMinCliVersion", "1.2.3", &result) 141 Expect(err).ToNot(HaveOccurred()) 142 143 Expect(result).To(BeTrue()) 144 }) 145 146 It("returns false if cli version is less than the required version", func() { 147 cf.Version = "1.2.3+abc123" 148 149 var result bool 150 err = client.Call("CliRpcCmd.IsMinCliVersion", "1.2.4", &result) 151 Expect(err).ToNot(HaveOccurred()) 152 153 Expect(result).To(BeFalse()) 154 }) 155 156 It("returns true if cli version is 'BUILT_FROM_SOURCE'", func() { 157 cf.Version = "BUILT_FROM_SOURCE" 158 159 var result bool 160 err = client.Call("CliRpcCmd.IsMinCliVersion", "12.0.6", &result) 161 Expect(err).ToNot(HaveOccurred()) 162 163 Expect(result).To(BeTrue()) 164 }) 165 }) 166 167 Describe(".SetPluginMetadata", func() { 168 var ( 169 metadata *plugin.PluginMetadata 170 ) 171 172 BeforeEach(func() { 173 rpcService, err = NewRpcService(nil, nil, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 174 Expect(err).ToNot(HaveOccurred()) 175 176 err := rpcService.Start() 177 Expect(err).ToNot(HaveOccurred()) 178 179 pingCli(rpcService.Port()) 180 181 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 182 Expect(err).ToNot(HaveOccurred()) 183 184 metadata = &plugin.PluginMetadata{ 185 Name: "foo", 186 Commands: []plugin.Command{ 187 {Name: "cmd_1", HelpText: "cm 1 help text"}, 188 {Name: "cmd_2", HelpText: "cmd 2 help text"}, 189 }, 190 } 191 }) 192 193 AfterEach(func() { 194 rpcService.Stop() 195 196 //give time for server to stop 197 time.Sleep(50 * time.Millisecond) 198 }) 199 200 It("set the rpc command's Return Data", func() { 201 var success bool 202 err = client.Call("CliRpcCmd.SetPluginMetadata", metadata, &success) 203 204 Expect(err).ToNot(HaveOccurred()) 205 Expect(success).To(BeTrue()) 206 Expect(rpcService.RpcCmd.PluginMetadata).To(Equal(metadata)) 207 }) 208 }) 209 210 Describe(".GetOutputAndReset", func() { 211 Context("success", func() { 212 BeforeEach(func() { 213 outputCapture := terminal.NewTeePrinter(os.Stdout) 214 rpcService, err = NewRpcService(outputCapture, nil, nil, api.RepositoryLocator{}, cmdRunner.NewCommandRunner(), nil, nil, rpc.DefaultServer) 215 Expect(err).ToNot(HaveOccurred()) 216 217 err := rpcService.Start() 218 Expect(err).ToNot(HaveOccurred()) 219 220 pingCli(rpcService.Port()) 221 }) 222 223 AfterEach(func() { 224 rpcService.Stop() 225 226 //give time for server to stop 227 time.Sleep(50 * time.Millisecond) 228 }) 229 230 It("should return the logs from the output capture", func() { 231 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 232 Expect(err).ToNot(HaveOccurred()) 233 234 success := false 235 236 oldStd := os.Stdout 237 os.Stdout = nil 238 client.Call("CliRpcCmd.CallCoreCommand", []string{"fake-command"}, &success) 239 Expect(success).To(BeTrue()) 240 os.Stdout = oldStd 241 242 var output []string 243 client.Call("CliRpcCmd.GetOutputAndReset", false, &output) 244 245 Expect(output).To(Equal([]string{"Requirement executed", "Command Executed"})) 246 }) 247 }) 248 }) 249 250 Describe("disabling terminal output", func() { 251 var terminalOutputSwitch *rpcfakes.FakeTerminalOutputSwitch 252 253 BeforeEach(func() { 254 terminalOutputSwitch = new(rpcfakes.FakeTerminalOutputSwitch) 255 rpcService, err = NewRpcService(nil, terminalOutputSwitch, nil, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 256 Expect(err).ToNot(HaveOccurred()) 257 258 err := rpcService.Start() 259 Expect(err).ToNot(HaveOccurred()) 260 261 pingCli(rpcService.Port()) 262 }) 263 264 It("should disable the terminal output switch", func() { 265 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 266 Expect(err).ToNot(HaveOccurred()) 267 268 var success bool 269 err = client.Call("CliRpcCmd.DisableTerminalOutput", true, &success) 270 271 Expect(err).ToNot(HaveOccurred()) 272 Expect(success).To(BeTrue()) 273 Expect(terminalOutputSwitch.DisableTerminalOutputCallCount()).To(Equal(1)) 274 Expect(terminalOutputSwitch.DisableTerminalOutputArgsForCall(0)).To(Equal(true)) 275 }) 276 }) 277 278 Describe("Plugin API", func() { 279 280 var runner *rpcfakes.FakeCommandRunner 281 282 BeforeEach(func() { 283 outputCapture := terminal.NewTeePrinter(os.Stdout) 284 terminalOutputSwitch := terminal.NewTeePrinter(os.Stdout) 285 286 runner = new(rpcfakes.FakeCommandRunner) 287 rpcService, err = NewRpcService(outputCapture, terminalOutputSwitch, nil, api.RepositoryLocator{}, runner, nil, nil, rpc.DefaultServer) 288 Expect(err).ToNot(HaveOccurred()) 289 290 err := rpcService.Start() 291 Expect(err).ToNot(HaveOccurred()) 292 293 pingCli(rpcService.Port()) 294 295 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 296 Expect(err).ToNot(HaveOccurred()) 297 }) 298 299 AfterEach(func() { 300 rpcService.Stop() 301 302 //give time for server to stop 303 time.Sleep(50 * time.Millisecond) 304 }) 305 306 It("calls GetApp() with 'app' as argument", func() { 307 result := plugin_models.GetAppModel{} 308 err = client.Call("CliRpcCmd.GetApp", "fake-app", &result) 309 310 Expect(err).ToNot(HaveOccurred()) 311 Expect(runner.CommandCallCount()).To(Equal(1)) 312 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 313 Expect(arg1[0]).To(Equal("app")) 314 Expect(arg1[1]).To(Equal("fake-app")) 315 Expect(pluginApiCall).To(BeTrue()) 316 }) 317 318 It("calls GetOrg() with 'my-org' as argument", func() { 319 result := plugin_models.GetOrg_Model{} 320 err = client.Call("CliRpcCmd.GetOrg", "my-org", &result) 321 322 Expect(err).ToNot(HaveOccurred()) 323 Expect(runner.CommandCallCount()).To(Equal(1)) 324 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 325 Expect(arg1[0]).To(Equal("org")) 326 Expect(arg1[1]).To(Equal("my-org")) 327 Expect(pluginApiCall).To(BeTrue()) 328 }) 329 330 It("calls GetSpace() with 'my-space' as argument", func() { 331 result := plugin_models.GetSpace_Model{} 332 err = client.Call("CliRpcCmd.GetSpace", "my-space", &result) 333 334 Expect(err).ToNot(HaveOccurred()) 335 Expect(runner.CommandCallCount()).To(Equal(1)) 336 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 337 Expect(arg1[0]).To(Equal("space")) 338 Expect(arg1[1]).To(Equal("my-space")) 339 Expect(pluginApiCall).To(BeTrue()) 340 }) 341 342 It("calls GetApps() ", func() { 343 result := []plugin_models.GetAppsModel{} 344 err = client.Call("CliRpcCmd.GetApps", "", &result) 345 346 Expect(err).ToNot(HaveOccurred()) 347 Expect(runner.CommandCallCount()).To(Equal(1)) 348 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 349 Expect(arg1[0]).To(Equal("apps")) 350 Expect(pluginApiCall).To(BeTrue()) 351 }) 352 353 It("calls GetOrgs() ", func() { 354 result := []plugin_models.GetOrgs_Model{} 355 err = client.Call("CliRpcCmd.GetOrgs", "", &result) 356 357 Expect(err).ToNot(HaveOccurred()) 358 Expect(runner.CommandCallCount()).To(Equal(1)) 359 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 360 Expect(arg1[0]).To(Equal("orgs")) 361 Expect(pluginApiCall).To(BeTrue()) 362 }) 363 364 It("calls GetServices() ", func() { 365 result := []plugin_models.GetServices_Model{} 366 err = client.Call("CliRpcCmd.GetServices", "", &result) 367 368 Expect(err).ToNot(HaveOccurred()) 369 Expect(runner.CommandCallCount()).To(Equal(1)) 370 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 371 Expect(arg1[0]).To(Equal("services")) 372 Expect(pluginApiCall).To(BeTrue()) 373 }) 374 375 It("calls GetSpaces() ", func() { 376 result := []plugin_models.GetSpaces_Model{} 377 err = client.Call("CliRpcCmd.GetSpaces", "", &result) 378 379 Expect(err).ToNot(HaveOccurred()) 380 Expect(runner.CommandCallCount()).To(Equal(1)) 381 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 382 Expect(arg1[0]).To(Equal("spaces")) 383 Expect(pluginApiCall).To(BeTrue()) 384 }) 385 386 It("calls GetOrgUsers() ", func() { 387 result := []plugin_models.GetOrgUsers_Model{} 388 args := []string{"orgName1", "-a"} 389 err = client.Call("CliRpcCmd.GetOrgUsers", args, &result) 390 391 Expect(err).ToNot(HaveOccurred()) 392 Expect(runner.CommandCallCount()).To(Equal(1)) 393 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 394 Expect(arg1[0]).To(Equal("org-users")) 395 Expect(pluginApiCall).To(BeTrue()) 396 }) 397 398 It("calls GetSpaceUsers() ", func() { 399 result := []plugin_models.GetSpaceUsers_Model{} 400 args := []string{"orgName1", "spaceName1"} 401 err = client.Call("CliRpcCmd.GetSpaceUsers", args, &result) 402 403 Expect(err).ToNot(HaveOccurred()) 404 Expect(runner.CommandCallCount()).To(Equal(1)) 405 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 406 Expect(arg1[0]).To(Equal("space-users")) 407 Expect(pluginApiCall).To(BeTrue()) 408 }) 409 410 It("calls GetService() with 'serviceInstance' as argument", func() { 411 result := plugin_models.GetService_Model{} 412 err = client.Call("CliRpcCmd.GetService", "fake-service-instance", &result) 413 414 Expect(err).ToNot(HaveOccurred()) 415 Expect(runner.CommandCallCount()).To(Equal(1)) 416 arg1, _, pluginApiCall := runner.CommandArgsForCall(0) 417 Expect(arg1[0]).To(Equal("service")) 418 Expect(arg1[1]).To(Equal("fake-service-instance")) 419 Expect(pluginApiCall).To(BeTrue()) 420 }) 421 422 }) 423 424 Describe(".CallCoreCommand", func() { 425 var runner *rpcfakes.FakeCommandRunner 426 427 Context("success", func() { 428 BeforeEach(func() { 429 430 outputCapture := terminal.NewTeePrinter(os.Stdout) 431 runner = new(rpcfakes.FakeCommandRunner) 432 433 rpcService, err = NewRpcService(outputCapture, nil, nil, api.RepositoryLocator{}, runner, nil, nil, rpc.DefaultServer) 434 Expect(err).ToNot(HaveOccurred()) 435 436 err := rpcService.Start() 437 Expect(err).ToNot(HaveOccurred()) 438 439 pingCli(rpcService.Port()) 440 }) 441 442 AfterEach(func() { 443 rpcService.Stop() 444 445 //give time for server to stop 446 time.Sleep(50 * time.Millisecond) 447 }) 448 449 It("is able to call a command", func() { 450 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 451 Expect(err).ToNot(HaveOccurred()) 452 453 var success bool 454 err = client.Call("CliRpcCmd.CallCoreCommand", []string{"fake-command3"}, &success) 455 456 Expect(err).ToNot(HaveOccurred()) 457 Expect(runner.CommandCallCount()).To(Equal(1)) 458 459 _, _, pluginApiCall := runner.CommandArgsForCall(0) 460 Expect(pluginApiCall).To(BeFalse()) 461 }) 462 }) 463 464 Describe("CLI Config object methods", func() { 465 var ( 466 config coreconfig.Repository 467 ) 468 469 BeforeEach(func() { 470 config = testconfig.NewRepositoryWithDefaults() 471 }) 472 473 AfterEach(func() { 474 rpcService.Stop() 475 476 //give time for server to stop 477 time.Sleep(50 * time.Millisecond) 478 }) 479 480 Context(".GetCurrentOrg", func() { 481 BeforeEach(func() { 482 config.SetOrganizationFields(models.OrganizationFields{ 483 GUID: "test-guid", 484 Name: "test-org", 485 QuotaDefinition: models.QuotaFields{ 486 GUID: "guid123", 487 Name: "quota123", 488 MemoryLimit: 128, 489 InstanceMemoryLimit: 16, 490 RoutesLimit: 5, 491 ServicesLimit: 6, 492 NonBasicServicesAllowed: true, 493 }, 494 }) 495 496 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 497 err := rpcService.Start() 498 Expect(err).ToNot(HaveOccurred()) 499 500 pingCli(rpcService.Port()) 501 }) 502 503 It("populates the plugin Organization object with the current org settings in config", func() { 504 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 505 Expect(err).ToNot(HaveOccurred()) 506 507 var org plugin_models.Organization 508 err = client.Call("CliRpcCmd.GetCurrentOrg", "", &org) 509 510 Expect(err).ToNot(HaveOccurred()) 511 Expect(org.Name).To(Equal("test-org")) 512 Expect(org.Guid).To(Equal("test-guid")) 513 }) 514 }) 515 516 Context(".GetCurrentSpace", func() { 517 BeforeEach(func() { 518 config.SetSpaceFields(models.SpaceFields{ 519 GUID: "space-guid", 520 Name: "space-name", 521 }) 522 523 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 524 err := rpcService.Start() 525 Expect(err).ToNot(HaveOccurred()) 526 527 pingCli(rpcService.Port()) 528 }) 529 530 It("populates the plugin Space object with the current space settings in config", func() { 531 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 532 Expect(err).ToNot(HaveOccurred()) 533 534 var space plugin_models.Space 535 err = client.Call("CliRpcCmd.GetCurrentSpace", "", &space) 536 537 Expect(err).ToNot(HaveOccurred()) 538 Expect(space.Name).To(Equal("space-name")) 539 Expect(space.Guid).To(Equal("space-guid")) 540 }) 541 }) 542 543 Context(".Username, .UserGuid, .UserEmail", func() { 544 BeforeEach(func() { 545 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 546 err := rpcService.Start() 547 Expect(err).ToNot(HaveOccurred()) 548 549 pingCli(rpcService.Port()) 550 }) 551 552 It("returns username, user guid and user email", func() { 553 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 554 Expect(err).ToNot(HaveOccurred()) 555 556 var result string 557 err = client.Call("CliRpcCmd.Username", "", &result) 558 Expect(err).ToNot(HaveOccurred()) 559 Expect(result).To(Equal("my-user")) 560 561 err = client.Call("CliRpcCmd.UserGuid", "", &result) 562 Expect(err).ToNot(HaveOccurred()) 563 Expect(result).To(Equal("my-user-guid")) 564 565 err = client.Call("CliRpcCmd.UserEmail", "", &result) 566 Expect(err).ToNot(HaveOccurred()) 567 Expect(result).To(Equal("my-user-email")) 568 }) 569 }) 570 571 Context(".IsSSLDisabled", func() { 572 BeforeEach(func() { 573 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 574 err := rpcService.Start() 575 Expect(err).ToNot(HaveOccurred()) 576 577 pingCli(rpcService.Port()) 578 }) 579 580 It("returns the IsSSLDisabled setting in config", func() { 581 config.SetSSLDisabled(true) 582 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 583 Expect(err).ToNot(HaveOccurred()) 584 585 var result bool 586 err = client.Call("CliRpcCmd.IsSSLDisabled", "", &result) 587 Expect(err).ToNot(HaveOccurred()) 588 Expect(result).To(BeTrue()) 589 }) 590 }) 591 592 Context(".IsLoggedIn", func() { 593 BeforeEach(func() { 594 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 595 err := rpcService.Start() 596 Expect(err).ToNot(HaveOccurred()) 597 598 pingCli(rpcService.Port()) 599 }) 600 601 It("returns the IsLoggedIn setting in config", func() { 602 config.SetAccessToken("Logged-In-Token") 603 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 604 Expect(err).ToNot(HaveOccurred()) 605 606 var result bool 607 err = client.Call("CliRpcCmd.IsLoggedIn", "", &result) 608 Expect(err).ToNot(HaveOccurred()) 609 Expect(result).To(BeTrue()) 610 }) 611 }) 612 613 Context(".HasOrganization and .HasSpace ", func() { 614 BeforeEach(func() { 615 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 616 err := rpcService.Start() 617 Expect(err).ToNot(HaveOccurred()) 618 619 pingCli(rpcService.Port()) 620 }) 621 622 It("returns the HasOrganization() and HasSpace() setting in config", func() { 623 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 624 Expect(err).ToNot(HaveOccurred()) 625 626 var result bool 627 err = client.Call("CliRpcCmd.HasOrganization", "", &result) 628 Expect(err).ToNot(HaveOccurred()) 629 Expect(result).To(BeTrue()) 630 631 err = client.Call("CliRpcCmd.HasSpace", "", &result) 632 Expect(err).ToNot(HaveOccurred()) 633 Expect(result).To(BeTrue()) 634 }) 635 }) 636 637 Context(".LoggregatorEndpoint and .DopplerEndpoint ", func() { 638 BeforeEach(func() { 639 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 640 err := rpcService.Start() 641 Expect(err).ToNot(HaveOccurred()) 642 643 pingCli(rpcService.Port()) 644 }) 645 646 It("returns the LoggregatorEndpoint() and DopplerEndpoint() setting in config", func() { 647 config.SetLoggregatorEndpoint("loggregator-endpoint-sample") 648 config.SetDopplerEndpoint("doppler-endpoint-sample") 649 650 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 651 Expect(err).ToNot(HaveOccurred()) 652 653 var result string 654 err = client.Call("CliRpcCmd.LoggregatorEndpoint", "", &result) 655 Expect(err).ToNot(HaveOccurred()) 656 Expect(result).To(Equal("loggregator-endpoint-sample")) 657 658 err = client.Call("CliRpcCmd.DopplerEndpoint", "", &result) 659 Expect(err).ToNot(HaveOccurred()) 660 Expect(result).To(Equal("doppler-endpoint-sample")) 661 }) 662 }) 663 664 Context(".ApiEndpoint, .ApiVersion and .HasAPIEndpoint", func() { 665 BeforeEach(func() { 666 rpcService, err = NewRpcService(nil, nil, config, api.RepositoryLocator{}, nil, nil, nil, rpc.DefaultServer) 667 err := rpcService.Start() 668 Expect(err).ToNot(HaveOccurred()) 669 670 pingCli(rpcService.Port()) 671 }) 672 673 It("returns the ApiEndpoint(), ApiVersion() and HasAPIEndpoint() setting in config", func() { 674 config.SetAPIVersion("v1.1.1") 675 config.SetAPIEndpoint("www.fake-domain.com") 676 677 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 678 Expect(err).ToNot(HaveOccurred()) 679 680 var result string 681 err = client.Call("CliRpcCmd.ApiEndpoint", "", &result) 682 Expect(err).ToNot(HaveOccurred()) 683 Expect(result).To(Equal("www.fake-domain.com")) 684 685 err = client.Call("CliRpcCmd.ApiVersion", "", &result) 686 Expect(err).ToNot(HaveOccurred()) 687 Expect(result).To(Equal("v1.1.1")) 688 689 var exists bool 690 err = client.Call("CliRpcCmd.HasAPIEndpoint", "", &exists) 691 Expect(err).ToNot(HaveOccurred()) 692 Expect(exists).To(BeTrue()) 693 694 }) 695 }) 696 697 Context(".AccessToken", func() { 698 var authRepo *authenticationfakes.FakeRepository 699 700 BeforeEach(func() { 701 authRepo = new(authenticationfakes.FakeRepository) 702 locator := api.RepositoryLocator{} 703 locator = locator.SetAuthenticationRepository(authRepo) 704 705 rpcService, err = NewRpcService(nil, nil, config, locator, nil, nil, nil, rpc.DefaultServer) 706 err := rpcService.Start() 707 Expect(err).ToNot(HaveOccurred()) 708 709 pingCli(rpcService.Port()) 710 }) 711 712 It("refreshes the token", func() { 713 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 714 Expect(err).ToNot(HaveOccurred()) 715 716 var result string 717 err = client.Call("CliRpcCmd.AccessToken", "", &result) 718 Expect(err).ToNot(HaveOccurred()) 719 720 Expect(authRepo.RefreshAuthTokenCallCount()).To(Equal(1)) 721 }) 722 723 It("returns the access token", func() { 724 authRepo.RefreshAuthTokenReturns("fake-access-token", nil) 725 726 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 727 Expect(err).ToNot(HaveOccurred()) 728 729 var result string 730 err = client.Call("CliRpcCmd.AccessToken", "", &result) 731 Expect(err).ToNot(HaveOccurred()) 732 Expect(result).To(Equal("fake-access-token")) 733 }) 734 735 It("returns the error from refreshing the access token", func() { 736 authRepo.RefreshAuthTokenReturns("", errors.New("refresh error")) 737 738 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 739 Expect(err).ToNot(HaveOccurred()) 740 741 var result string 742 err = client.Call("CliRpcCmd.AccessToken", "", &result) 743 Expect(err.Error()).To(Equal("refresh error")) 744 }) 745 }) 746 747 }) 748 749 Context("fail", func() { 750 BeforeEach(func() { 751 outputCapture := terminal.NewTeePrinter(os.Stdout) 752 rpcService, err = NewRpcService(outputCapture, nil, nil, api.RepositoryLocator{}, cmdRunner.NewCommandRunner(), nil, nil, rpc.DefaultServer) 753 Expect(err).ToNot(HaveOccurred()) 754 755 err := rpcService.Start() 756 Expect(err).ToNot(HaveOccurred()) 757 758 pingCli(rpcService.Port()) 759 }) 760 761 It("returns false in success if the command cannot be found", func() { 762 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 763 Expect(err).ToNot(HaveOccurred()) 764 765 var success bool 766 err = client.Call("CliRpcCmd.CallCoreCommand", []string{"not_a_cmd"}, &success) 767 Expect(success).To(BeFalse()) 768 Expect(err).ToNot(HaveOccurred()) 769 }) 770 771 It("returns an error if a command cannot parse provided flags", func() { 772 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 773 Expect(err).ToNot(HaveOccurred()) 774 775 var success bool 776 err = client.Call("CliRpcCmd.CallCoreCommand", []string{"fake-command", "-invalid_flag"}, &success) 777 778 Expect(err).To(HaveOccurred()) 779 Expect(success).To(BeFalse()) 780 }) 781 782 It("recovers from a panic from any core command", func() { 783 client, err = rpc.Dial("tcp", "127.0.0.1:"+rpcService.Port()) 784 Expect(err).ToNot(HaveOccurred()) 785 786 var success bool 787 err = client.Call("CliRpcCmd.CallCoreCommand", []string{"fake-command3"}, &success) 788 789 Expect(success).To(BeFalse()) 790 }) 791 }) 792 }) 793 }) 794 795 func pingCli(port string) { 796 var connErr error 797 var conn net.Conn 798 for i := 0; i < 5; i++ { 799 conn, connErr = net.Dial("tcp", "127.0.0.1:"+port) 800 if connErr != nil { 801 time.Sleep(200 * time.Millisecond) 802 } else { 803 conn.Close() 804 break 805 } 806 } 807 Expect(connErr).ToNot(HaveOccurred()) 808 }