1 package server
2
3 import (
4 "bytes"
5 "context"
6 "encoding/json"
7 "errors"
8 "fmt"
9 "io"
10 "net/http"
11 "net/http/httptest"
12 "strings"
13 "testing"
14 "time"
15
16 "edge-infra.dev/pkg/sds/emergencyaccess/eaconst"
17 "edge-infra.dev/pkg/sds/emergencyaccess/eagateway"
18 "edge-infra.dev/pkg/sds/emergencyaccess/msgdata"
19 "edge-infra.dev/pkg/sds/emergencyaccess/remotecli"
20 "edge-infra.dev/pkg/sds/emergencyaccess/types"
21
22 "github.com/gin-gonic/gin"
23 "github.com/stretchr/testify/assert"
24 )
25
26 type endSessionTestRCLI struct {
27 eagateway.RemoteCLI
28 cache map[string]remotecli.Target
29 }
30
31 func (rcli *endSessionTestRCLI) StartSession(_ context.Context, sessionID string, _ chan<- msgdata.CommandResponse, target remotecli.Target, _ ...remotecli.RCLIOption) error {
32 rcli.cache[sessionID] = target
33 return nil
34 }
35
36 func (rcli *endSessionTestRCLI) EndSession(_ context.Context, sessionID string) error {
37 if sessionID == "fail" {
38 return errors.New(sessionID)
39 }
40 delete(rcli.cache, sessionID)
41 return nil
42 }
43
44 func TestEndSessionSuccess(t *testing.T) {
45 r := httptest.NewRecorder()
46 gin.SetMode(gin.TestMode)
47 c, ginEngine := gin.CreateTestContext(r)
48
49
50 authServer, authServerURL := authserviceServer(http.StatusOK)
51 defer authServer.Close()
52
53 rcli := &endSessionTestRCLI{}
54 rcli.cache = make(map[string]remotecli.Target)
55 config := eagateway.Config{AuthServiceHost: authServerURL}
56 server, err := New(config, ginEngine, newLogger(), rcli, nil)
57 assert.NoError(t, err)
58
59
60 for i := 0; i <= 2; i++ {
61 sessionID := fmt.Sprint(i)
62 target := defaultTarget
63 target.Terminalid = fmt.Sprint(i)
64 err = server.rcli.StartSession(c, sessionID, nil, target)
65 assert.NoError(t, err)
66 }
67
68 for i := 0; i < 2; i++ {
69 sessionID := fmt.Sprint(i)
70 payload := types.EndSessionPayload{SessionID: sessionID}
71 message, err := json.Marshal(payload)
72 assert.NoError(t, err)
73
74 req, err := http.NewRequestWithContext(c, http.MethodPost, "/ea/endSession", bytes.NewReader(message))
75 assert.NoError(t, err)
76 req.Header.Set(eaconst.HeaderAuthKeyRoles, "role")
77 ginEngine.ServeHTTP(r, req)
78 assert.Eventually(t, func() bool {
79 return r.Result().StatusCode == http.StatusOK
80 }, 100*time.Millisecond, 10*time.Millisecond)
81
82 assert.Nil(t, rcli.cache[sessionID])
83 for j := i + 1; j <= 2; j++ {
84 assert.NotNil(t, rcli.cache[fmt.Sprint(j)])
85 }
86 }
87 }
88
89 func TestEndSessionFail(t *testing.T) {
90 tests := map[string]struct {
91 sessionID string
92 target types.Target
93 expStatusCode int
94 expOut string
95 }{
96 "Invalid Payload": {
97 sessionID: "",
98 target: types.Target{},
99 expStatusCode: http.StatusBadRequest,
100 expOut: `{"details":["Payload missing Session ID"], "errorCode":60202, "errorMessage":"Request Error - Invalid payload properties"}`,
101 },
102 "RCLI Fail": {
103 sessionID: "fail",
104 target: defaultTarget,
105 expStatusCode: http.StatusInternalServerError,
106 expOut: `{"errorCode": 63101, "errorMessage": "End Session Failure - Failed to end session"}`,
107 },
108
109 }
110
111 for name, tc := range tests {
112 t.Run(name, func(t *testing.T) {
113 r := httptest.NewRecorder()
114 gin.SetMode(gin.TestMode)
115 c, ginEngine := gin.CreateTestContext(r)
116
117
118 authServer, authServerURL := authserviceServer(http.StatusOK)
119 defer authServer.Close()
120
121 rcli := &endSessionTestRCLI{}
122 rcli.cache = make(map[string]remotecli.Target)
123 server, err := New(eagateway.Config{AuthServiceHost: authServerURL}, ginEngine, newLogger(), rcli, nil)
124 assert.NoError(t, err)
125
126
127 err = server.rcli.StartSession(c, tc.sessionID, nil, tc.target)
128 assert.NoError(t, err)
129
130 payload := types.EndSessionPayload{SessionID: tc.sessionID}
131 message, err := json.Marshal(payload)
132 assert.NoError(t, err)
133 req, err := http.NewRequestWithContext(c, http.MethodPost, "/ea/endSession", bytes.NewReader(message))
134 assert.NoError(t, err)
135 req.Header.Set(eaconst.HeaderAuthKeyRoles, "role")
136 ginEngine.ServeHTTP(r, req)
137
138 assert.Equal(t, tc.expStatusCode, r.Result().StatusCode)
139
140 buf := strings.Builder{}
141 _, err = io.Copy(&buf, r.Result().Body)
142 assert.NoError(t, err)
143
144 assert.JSONEq(t, tc.expOut, buf.String())
145 })
146 }
147 }
148
View as plain text