+func AddTerms(t *testing.T, nbTerms int, listID []string, chTermEvt chan xsapiv1.TerminalConfig, sshDir string, port string) {
+ for j := 0; j < len(listID); j++ {
+ listTermsID := make([]string, nbTerms)
+ for i := 0; i < nbTerms; i++ {
+ term := xsapiv1.TerminalConfig{
+ Name: "terminal" + strconv.Itoa(i),
+ Type: xsapiv1.TypeTermSSH,
+ Options: []string{
+ "-p",
+ port,
+ "-i",
+ sshDir + "/ssh",
+ "-o",
+ "StrictHostKeyChecking=no",
+ },
+ }
+ /*add terminal on target*/
+ require.Nil(t, HTTPCli.Post("/targets/"+listID[j]+"/terminals", term, &term))
+ Debugf(t, "add terminal %v", term.Name)
+ termEvt := <-chTermEvt //waiting for event terminalAdd*/
+ require.Equal(t, term.ID, termEvt.ID)
+ listTermsID[i] = term.ID
+ }
+ require.Equal(t, len(listTermsID), nbTerms)
+ for i := 0; i < nbTerms; i++ {
+ var term xsapiv1.TerminalConfig
+ require.Nil(t, HTTPCli.Get("/targets/"+listID[j]+"/terminals/"+listTermsID[i], &term))
+ require.Equal(t, term.Status, "Close")
+ }
+ }
+}
+
+func PostTerms(t *testing.T, post string, chTermEvt chan xsapiv1.TerminalConfig, chTerm chan xsapiv1.TerminalOutMsg,
+ prompt string) {
+ var status string
+ switch post {
+ case "open":
+ status = "Open"
+ case "close":
+ status = "Closing"
+ }
+ var targets []xsapiv1.TargetConfig
+ require.Nil(t, HTTPCli.Get("/targets", &targets))
+ for i := 0; i < len(targets); i++ {
+ var terms []xsapiv1.TerminalConfig
+ require.Nil(t, HTTPCli.Get("/targets/"+targets[i].ID+"/terminals", &terms))
+ listTermsID := make([]string, len(terms))
+ for j := 0; j < len(terms); j++ {
+ var term xsapiv1.TerminalConfig
+ /*post action on term*/
+ require.Nil(t, HTTPCli.Post("/targets/"+targets[i].ID+"/terminals/"+terms[j].ID+"/"+post, terms[j], &term))
+ Debugf(t, "%v terminal %v", post, term.Name)
+ termEvt := <-chTermEvt //waiting for event terminalStateChange
+ if post == "open" {
+ data := []byte("PS1=" + prompt + " bash -norc\n")
+ require.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
+ waitForPrompt(t, chTerm, prompt)
+ }
+ require.Equal(t, term.ID, termEvt.ID)
+ require.Equal(t, term.Status, status)
+ require.Equal(t, termEvt.Status, status)
+ listTermsID[i] = term.ID
+ }
+ time.Sleep(10 * time.Millisecond)
+ for j := 0; j < len(listTermsID); j++ {
+ var term xsapiv1.TerminalConfig
+ require.Nil(t, HTTPCli.Get("/targets/"+targets[i].ID+"/terminals/"+listTermsID[i], &term))
+ require.True(t, strings.EqualFold(term.Status, post))
+ Debugf(t, "check that term status %v is %v", term.Name, post)
+ }
+ }
+}
+
+func RemoveTermsTargets(t *testing.T, chTarget chan xsapiv1.TargetConfig, chTermEvt chan xsapiv1.TerminalConfig) {
+ var targets []xsapiv1.TargetConfig
+ require.Nil(t, HTTPCli.Get("/targets", &targets))
+ for i := 0; i < len(targets); i++ {
+ var terms []xsapiv1.TerminalConfig
+ require.Nil(t, HTTPCli.Get("/targets/"+targets[i].ID+"/terminals", &terms))
+ for j := 0; j < len(terms); j++ {
+ var term xsapiv1.TerminalConfig
+ require.Nil(t, HTTPCli.Delete("/targets/"+targets[i].ID+"/terminals/"+terms[j].ID, &term))
+ termEvt := <-chTermEvt
+ require.Equal(t, term.ID, termEvt.ID)
+ require.NotNil(t, HTTPCli.Delete("/targets/"+targets[i].ID+"/terminals/"+terms[j].ID, &term))
+ Debugf(t, "remove terminal %v", term.Name)
+ }
+ var tgtRes xsapiv1.TargetConfig
+ require.Nil(t, HTTPCli.Delete("/targets/"+targets[i].ID, &tgtRes))
+ targetEvt := <-chTarget //waiting for remove terminal event
+ require.Equal(t, tgtRes.ID, targetEvt.ID)
+ require.Equal(t, targets[i].ID, tgtRes.ID)
+ }
+}
+func TestTarget(t *testing.T) {
+ prompt := "--PROMPT--"
+ var procSSHd *os.Process
+ sshDir, port := InitSSH(t, &procSSHd)
+ defer procSSHd.Kill()
+
+ nbTargets := 2
+ nbTermsByTarget := 2
+ /*channel for target events*/
+ chTarget := make(chan xsapiv1.TargetConfig)
+ defer close(chTarget)
+ ConnectTargetEvents(t, chTarget)
+
+ /*channel for terminal events*/
+ chTermEvt := make(chan xsapiv1.TerminalConfig)
+ defer close(chTermEvt)
+ ConnectTermEvents(t, chTermEvt)
+
+ /*check that targetArray is empty at startup*/
+ var targetArray []xsapiv1.TargetConfig
+ require.Nil(t, HTTPCli.Get("/targets", &targetArray))
+ require.Equal(t, len(targetArray), 0)
+
+ listID := AddTargets(t, nbTargets, chTarget)
+ AddTerms(t, nbTermsByTarget, listID, chTermEvt, sshDir, port)
+
+ /*channel for TerminalOutMsg*/