Skip to content

Commit 80e4143

Browse files
committed
Add async JSON/REST system tests.
1 parent e1fd690 commit 80e4143

File tree

2 files changed

+87
-7
lines changed

2 files changed

+87
-7
lines changed

speech/google/cloud/speech/metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def from_api_repr(cls, response):
4646
"""
4747
last_update = _rfc3339_to_datetime(response['lastUpdateTime'])
4848
start_time = _rfc3339_to_datetime(response['startTime'])
49-
progress_percent = response['progressPercent']
49+
progress_percent = response.get('progressPercent')
5050

5151
return cls(last_update, start_time, progress_percent)
5252

system_tests/speech.py

Lines changed: 86 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,33 @@
2222

2323
from system_test_utils import unique_resource_id
2424
from retry import RetryErrors
25+
from retry import RetryResult
2526

2627
AUDIO_FILE = os.path.join(os.path.dirname(__file__), 'data', 'hello.wav')
2728

2829

30+
def _operation_complete(result):
31+
"""Return operation result."""
32+
return result
33+
34+
35+
def _wait_until_complete(operation, max_attempts=5):
36+
"""Wait until an operation has completed.
37+
38+
:type operation: :class:`google.cloud.operation.Operation`
39+
:param operation: Operation that has not completed.
40+
41+
:type max_attempts: int
42+
:param max_attempts: (Optional) The maximum number of times to check if
43+
the operation has completed. Defaults to 5.
44+
45+
:rtype: bool
46+
:returns: Boolean indicating if the operation is complete.
47+
"""
48+
retry = RetryResult(_operation_complete, max_tries=max_attempts)
49+
return retry(operation.poll)()
50+
51+
2952
class Config(object):
3053
"""Run-time configuration to be modified at set-up.
3154
@@ -34,10 +57,12 @@ class Config(object):
3457
"""
3558
CLIENT = None
3659
TEST_BUCKET = None
60+
USE_GAX = True
3761

3862

3963
def setUpModule():
4064
Config.CLIENT = speech.Client()
65+
Config.USE_GAX = Config.CLIENT._use_gax
4166
# Now create a bucket for GCS stored content.
4267
storage_client = storage.Client()
4368
bucket_name = 'new' + unique_resource_id()
@@ -72,12 +97,24 @@ def _make_sync_request(self, content=None, source_uri=None,
7297
source_uri=source_uri,
7398
encoding=speech.Encoding.LINEAR16,
7499
sample_rate=16000)
75-
result = client.sync_recognize(sample,
76-
language_code='en-US',
77-
max_alternatives=max_alternatives,
78-
profanity_filter=True,
79-
speech_context=['Google', 'cloud'])
80-
return result
100+
return client.sync_recognize(sample,
101+
language_code='en-US',
102+
max_alternatives=max_alternatives,
103+
profanity_filter=True,
104+
speech_context=['Google', 'cloud'])
105+
106+
def _make_async_request(self, content=None, source_uri=None,
107+
max_alternatives=None):
108+
client = Config.CLIENT
109+
sample = client.sample(content=content,
110+
source_uri=source_uri,
111+
encoding=speech.Encoding.LINEAR16,
112+
sample_rate=16000)
113+
return client.async_recognize(sample,
114+
language_code='en-US',
115+
max_alternatives=max_alternatives,
116+
profanity_filter=True,
117+
speech_context=['Google', 'cloud'])
81118

82119
def _check_best_results(self, results):
83120
top_result = results[0]
@@ -109,3 +146,46 @@ def test_sync_recognize_gcs_file(self):
109146
result = self._make_sync_request(source_uri=source_uri,
110147
max_alternatives=1)
111148
self._check_best_results(result)
149+
150+
def test_async_recognize_local_file(self):
151+
if Config.USE_GAX:
152+
self.skipTest('async_recognize gRPC not yet implemented.')
153+
with open(AUDIO_FILE, 'rb') as file_obj:
154+
content = file_obj.read()
155+
156+
operation = self._make_async_request(content=content,
157+
max_alternatives=2)
158+
159+
_wait_until_complete(operation)
160+
161+
self.assertEqual(len(operation.results), 2)
162+
self._check_best_results(operation.results)
163+
164+
results = operation.results
165+
self.assertIsInstance(results[1], Transcript)
166+
self.assertEqual(results[1].transcript, self.ASSERT_TEXT)
167+
self.assertEqual(results[1].confidence, None)
168+
169+
def test_async_recognize_gcs_file(self):
170+
if Config.USE_GAX:
171+
self.skipTest('async_recognize gRPC not yet implemented.')
172+
bucket_name = Config.TEST_BUCKET.name
173+
blob_name = 'hello.wav'
174+
blob = Config.TEST_BUCKET.blob(blob_name)
175+
self.to_delete_by_case.append(blob) # Clean-up.
176+
with open(AUDIO_FILE, 'rb') as file_obj:
177+
blob.upload_from_file(file_obj)
178+
179+
source_uri = 'gs://%s/%s' % (bucket_name, blob_name)
180+
operation = self._make_async_request(source_uri=source_uri,
181+
max_alternatives=2)
182+
183+
_wait_until_complete(operation)
184+
185+
self.assertEqual(len(operation.results), 2)
186+
self._check_best_results(operation.results)
187+
188+
results = operation.results
189+
self.assertIsInstance(results[1], Transcript)
190+
self.assertEqual(results[1].transcript, self.ASSERT_TEXT)
191+
self.assertEqual(results[1].confidence, None)

0 commit comments

Comments
 (0)