def testCreateConnectUrl(self, target, expected_base, expected_query): tunnel_target = utils.IapTunnelTargetInfo(*target) created_url = utils.CreateWebSocketConnectUrl(tunnel_target) created_url_parts = created_url.split('?', 1) self.assertEqual(created_url_parts[0], expected_base) self.assertEqual(sorted(created_url_parts[1].split('&')), expected_query)
def _GetTunnelTargetInfo(self): proxy_info = http_proxy.GetHttpProxyInfo() if callable(proxy_info): proxy_info = proxy_info(method='https') return utils.IapTunnelTargetInfo(project=self._project, zone=self._zone, instance=self._instance, interface=self._interface, port=self._port, url_override=self._iap_tunnel_url_override, proxy_info=proxy_info)
def SetUp(self): self._received_data = [] self._close_received = False self.tunnel_target = utils.IapTunnelTargetInfo( project='project-a', zone='zone-b', instance='instance-c', interface='nic0', port=22, url_override=None, proxy_info=None) self.iap_tunnel_websocket = iap_tunnel_websocket.IapTunnelWebSocket( self.tunnel_target, GetAccessToken, self.DataCallback, self.CloseCallback, ignore_certs=True) self.iap_tunnel_websocket._websocket_helper = mock.MagicMock() self.iap_tunnel_websocket._connect_msg_received = True
def testSimpleCase(self): self.make_requests.side_effect = [ [INSTANCE_WITH_EXTERNAL_ADDRESS], [self.v1_messages.Project(name='my-project')], ] self.Run('compute start-iap-tunnel instance-1 22 --zone zone-1 ' '--listen-on-stdin') self.CheckRequests([ (self.compute.instances, 'Get', self.messages.ComputeInstancesGetRequest( instance='instance-1', project='my-project', zone='zone-1')) ], ) self.assertEqual(self.c_store_load.call_count, 1) self.assertEqual(self.c_store_refresh.call_count, 0) # The last call results in no data and signals closing of the connection. if platforms.OperatingSystem.IsWindows(): # Three ReadFile() calls that result in two websocket Send(). ctypes.windll.kernel32.ReadFile.assert_has_calls( [mock.call(mock.ANY, mock.ANY, 16384, mock.ANY, None)] * 3) self.assertEqual(ctypes.windll.kernel32.ReadFile.call_count, 3) else: # Three read() calls that result in two websocket Send(). self.stdin_mock.read.assert_has_calls([mock.call(16384)] * 3) self.assertEqual(self.stdin_mock.read.call_count, 3) tunnel_target = iap_tunnel_websocket_utils.IapTunnelTargetInfo( project='my-project', zone='zone-1', instance='instance-1', interface='nic0', port=22, url_override=None, proxy_info=None) partial_matcher = mock_matchers.TypeMatcher(functools.partial) self.websocket_cls_mock.assert_called_once_with(tunnel_target, partial_matcher, partial_matcher, partial_matcher, ignore_certs=False) self.assertEqual(self.websocket_mock.InitiateConnection.call_count, 1) self.websocket_mock.Send.assert_has_calls( [mock.call(b'data1'), mock.call(b'data2')]) self.assertEqual(self.websocket_mock.Send.call_count, 2) self.assertEqual(self.websocket_mock.LocalEOF.call_count, 1) self.assertEqual(self.websocket_mock.WaitForAllSent.call_count, 1) self.assertEqual(self.websocket_mock.Close.call_count, 1)
def _GetTunnelTargetInfo(self): proxy_info = http_proxy.GetHttpProxyInfo() if callable(proxy_info): proxy_info = proxy_info(method='https') return utils.IapTunnelTargetInfo( project=self._project, zone=self._zone, instance=self._instance, interface=self._interface, port=self._port, url_override=self._iap_tunnel_url_override, proxy_info=proxy_info, region=self._region, network=self._network, host=self._host, dest_group=self._dest_group)
def testInit_MissingTargetParam(self, target, expected_error, expected_message): tunnel_target = utils.IapTunnelTargetInfo(*target) with self.AssertRaisesExceptionMatches(expected_error, expected_message): utils.ValidateParameters(tunnel_target)
def testSimpleCase(self, gcloud_cmd): self.make_requests.side_effect = [ [INSTANCE_WITH_EXTERNAL_ADDRESS], [self.v1_messages.Project(name='my-project')], ] self.Run(gcloud_cmd) self.CheckRequests( [(self.compute.instances, 'Get', self.messages.ComputeInstancesGetRequest( instance='instance-1', project='my-project', zone='zone-1'))], ) self.assertEqual(self.c_store_load.call_count, 2) self.assertEqual(self.c_store_refresh.call_count, 0) self.assertEqual(self.portpicker_mock.call_count, 1) self.socket_getaddrinfo.assert_has_calls([ mock.call('localhost', 22175, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)]) self.assertEqual(self.socket_getaddrinfo.call_count, 1) # Server socket is created then bind() and listen() followed by select() # at least twice -- the first yielding the one connection from accept() call # and a later one being interrupted by a raised keyboard exception. self.socket_init.assert_has_calls([ mock.call(socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP), mock.call(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)]) self.assertEqual(self.socket_init.call_count, 2) self.socket_mock.bind.assert_has_calls([mock.call(('::1', 22175, 0, 0))]) self.assertEqual(self.socket_mock.bind.call_count, 1) self.socket_mock.listen.assert_has_calls([mock.call(1)]) self.assertEqual(self.socket_mock.listen.call_count, 1) self.socket_mock2.bind.assert_has_calls([mock.call(('127.0.0.1', 22175))]) self.assertEqual(self.socket_mock2.bind.call_count, 1) self.socket_mock2.listen.assert_has_calls([mock.call(1)]) self.assertEqual(self.socket_mock2.listen.call_count, 1) self.select_mock.assert_called_with([self.socket_mock, self.socket_mock2], (), (), 0.2) self.assertTrue(self.select_mock.call_count >= 2) # pylint:disable=g-generic-assert self.socket_mock.accept.assert_has_calls([mock.call()]) self.assertEqual(self.socket_mock.accept.call_count, 1) # Note that other code using socket # (e.g. devshell_test_base.AuthReferenceServer) may also make calls to # this mock. self.socket_mock.close.assert_has_calls([mock.call()]) self.assertEqual(self.socket_mock2.accept.call_count, 0) self.socket_mock2.close.assert_has_calls([mock.call()]) # Calls for one connection that was accepted. Three recv() calls that # result in two websocket Send(). The last results in no data and signals # closing of the connection. self.conn_mock.recv.assert_has_calls([mock.call(16384)]*3) self.assertEqual(self.conn_mock.recv.call_count, 3) self.conn_mock.close.assert_has_calls([mock.call()]) self.assertTrue(self.conn_mock.close.call_count >= 1) # pylint:disable=g-generic-assert tunnel_target = iap_tunnel_websocket_utils.IapTunnelTargetInfo( project='my-project', zone='zone-1', instance='instance-1', interface='nic0', port=22, url_override=None, proxy_info=None) partial_matcher = mock_matchers.TypeMatcher(functools.partial) self.websocket_cls_mock.assert_has_calls([ mock.call(tunnel_target, partial_matcher, partial_matcher, partial_matcher, ignore_certs=False)]*2) self.assertEqual(self.websocket_cls_mock.call_count, 2) # Test connection to start. self.assertEqual(self.websocket_mock1.InitiateConnection.call_count, 1) self.assertEqual(self.websocket_mock1.Send.call_count, 0) self.assertEqual(self.websocket_mock1.LocalEOF.call_count, 0) self.assertEqual(self.websocket_mock1.WaitForAllSent.call_count, 0) self.assertEqual(self.websocket_mock1.Close.call_count, 1) # Calls resulting from one connection that was accepted. self.assertEqual(self.websocket_mock2.InitiateConnection.call_count, 1) self.websocket_mock2.Send.assert_has_calls([ mock.call(b'data1'), mock.call(b'data2')]) self.assertEqual(self.websocket_mock2.Send.call_count, 2) self.assertEqual(self.websocket_mock2.LocalEOF.call_count, 1) self.assertEqual(self.websocket_mock2.WaitForAllSent.call_count, 1) self.assertEqual(self.websocket_mock2.Close.call_count, 1)