def testGetMetadataRequestRetry(self, mock_request, mock_urlopen,
                                    mock_time):
        mocks = mock.Mock()
        mocks.attach_mock(mock_request, 'request')
        mocks.attach_mock(mock_urlopen, 'urlopen')
        mocks.attach_mock(mock_time, 'time')
        mock_request.return_value = mock_request
        mock_unavailable = mock.Mock()
        mock_unavailable.getcode.return_value = (
            metadata_watcher.httpclient.SERVICE_UNAVAILABLE)
        mock_success = mock.Mock()
        mock_success.getcode.return_value = metadata_watcher.httpclient.OK

        # Retry after a service unavailable error response.
        mock_urlopen.side_effect = [
            metadata_watcher.StatusException(mock_unavailable),
            mock_success,
        ]

        self.mock_watcher._GetMetadataRequest(self.url)
        request_url = '%s?' % self.url
        headers = {'Metadata-Flavor': 'Google'}
        timeout = self.timeout * 1.1
        expected_calls = [
            mock.call.request(request_url, headers=headers),
            mock.call.urlopen(mock_request, timeout=timeout),
            mock.call.time.sleep(mock.ANY),
            mock.call.request(request_url, headers=headers),
            mock.call.urlopen(mock_request, timeout=timeout),
        ]
        self.assertEqual(mocks.mock_calls, expected_calls)
    def testGetMetadataRequestHttpException(self, mock_request, mock_urlopen):
        mock_request.return_value = mock_request
        mock_response = mock.Mock()
        mock_response.getcode.return_value = metadata_watcher.httpclient.NOT_FOUND
        mock_urlopen.side_effect = metadata_watcher.StatusException(
            mock_response),

        with self.assertRaises(metadata_watcher.StatusException):
            self.mock_watcher._GetMetadataRequest(self.url)
        self.assertEqual(mock_request.call_count, 1)
        self.assertEqual(mock_urlopen.call_count, 1)