@@ -16,6 +16,7 @@ package mock
1616
1717import  (
1818	"encoding/json" 
19+ 	"fmt" 
1920	"net" 
2021	"os" 
2122	"sync" 
@@ -153,6 +154,72 @@ func stdinShimHandler(data []byte, userData interface{}, response *handlerRespon
153154	proxy .StdinReceived  <-  true 
154155}
155156
157+ func  registerVMHandler (data  []byte , userData  interface {}, response  * handlerResponse ) {
158+ 	client  :=  userData .(* client )
159+ 	proxy  :=  client .proxy 
160+ 
161+ 	proxy .log ("Register VM" )
162+ 
163+ 	payload  :=  api.RegisterVM {}
164+ 	if  err  :=  json .Unmarshal (data , & payload ); err  !=  nil  {
165+ 		response .SetError (err )
166+ 		return 
167+ 	}
168+ 
169+ 	// Generate fake tokens 
170+ 	var  tokens  []string 
171+ 	for  i  :=  0 ; i  <  payload .NumIOStreams ; i ++  {
172+ 		tokens  =  append (tokens , fmt .Sprintf ("%d" , i ))
173+ 	}
174+ 
175+ 	io  :=  & api.IOResponse {
176+ 		Tokens : tokens ,
177+ 	}
178+ 
179+ 	response .AddResult ("io" , io )
180+ }
181+ 
182+ func  unregisterVMHandler (data  []byte , userData  interface {}, response  * handlerResponse ) {
183+ 	client  :=  userData .(* client )
184+ 	proxy  :=  client .proxy 
185+ 
186+ 	proxy .log ("Unregister VM" )
187+ }
188+ 
189+ func  attachVMHandler (data  []byte , userData  interface {}, response  * handlerResponse ) {
190+ 	client  :=  userData .(* client )
191+ 	proxy  :=  client .proxy 
192+ 
193+ 	proxy .log ("Attach VM" )
194+ 
195+ 	payload  :=  api.AttachVM {}
196+ 	if  err  :=  json .Unmarshal (data , & payload ); err  !=  nil  {
197+ 		response .SetError (err )
198+ 		return 
199+ 	}
200+ 
201+ 	// Generate fake tokens 
202+ 	var  tokens  []string 
203+ 	for  i  :=  0 ; i  <  payload .NumIOStreams ; i ++  {
204+ 		tokens  =  append (tokens , fmt .Sprintf ("%d" , i ))
205+ 	}
206+ 
207+ 	io  :=  & api.IOResponse {
208+ 		Tokens : tokens ,
209+ 	}
210+ 
211+ 	response .AddResult ("io" , io )
212+ }
213+ 
214+ func  hyperCmdHandler (data  []byte , userData  interface {}, response  * handlerResponse ) {
215+ 	client  :=  userData .(* client )
216+ 	proxy  :=  client .proxy 
217+ 
218+ 	proxy .log ("Hyper command" )
219+ 
220+ 	response .SetData ([]byte {})
221+ }
222+ 
156223// SendStdoutStream sends a Stdout Stream Frame to connected client 
157224func  (proxy  * Proxy ) SendStdoutStream (payload  []byte ) {
158225	err  :=  api .WriteStream (proxy .cl , api .StreamStdout , payload )
@@ -198,19 +265,34 @@ func (proxy *Proxy) serveClient(proto *protocol, newConn net.Conn) {
198265func  (proxy  * Proxy ) serve () {
199266	proto  :=  newProtocol ()
200267
268+ 	// shim handlers 
201269	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdConnectShim )}, connectShimHandler )
202270	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdDisconnectShim )}, disconnectShimHandler )
203- 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdSignal )}, signalShimHandler )
204- 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdConnectShim )}, connectShimHandler )
205- 
206271	proto .Handle (FrameKey {api .TypeStream , int (api .StreamStdin )}, stdinShimHandler )
207272
273+ 	// runtime handlers 
274+ 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdRegisterVM )}, registerVMHandler )
275+ 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdUnregisterVM )}, unregisterVMHandler )
276+ 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdAttachVM )}, attachVMHandler )
277+ 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdHyper )}, hyperCmdHandler )
278+ 
279+ 	// Shared handler between shim and runtime 
280+ 	proto .Handle (FrameKey {api .TypeCommand , int (api .CmdSignal )}, signalShimHandler )
281+ 
208282	//Wait for a single client connection 
209283	conn , err  :=  proxy .listener .Accept ()
210- 	assert .Nil (proxy .t , err )
284+ 	if  err  !=  nil  {
285+ 		// Ending up into this case when the listener is closed, which 
286+ 		// is still a valid case. We don't want to throw an error in 
287+ 		// this case. 
288+ 		return 
289+ 	}
290+ 
211291	assert .NotNil (proxy .t , conn )
212292	proxy .log ("Client connected" )
213293
294+ 	proxy .wg .Add (1 )
295+ 
214296	proxy .cl  =  conn 
215297
216298	proxy .serveClient (proto , conn )
@@ -219,8 +301,11 @@ func (proxy *Proxy) serve() {
219301// Start invokes mock proxy instance to start listening. 
220302func  (proxy  * Proxy ) Start () {
221303	proxy .startListening ()
222- 	proxy .wg .Add (1 )
223- 	go  proxy .serve ()
304+ 	go  func () {
305+ 		for  {
306+ 			proxy .serve ()
307+ 		}
308+ 	}()
224309}
225310
226311// Stop causes  mock proxy instance to stop listening, 
0 commit comments