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  }