Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
2cba844
Certs Final PR (#7076)
iscai-msft Sep 6, 2019
7e0ddbe
Perform encrypt/verify/wrap locally when possible (#6939)
chlowell Sep 7, 2019
6aba868
[EventHubs] Track2 Preview3 (#7059)
yunhaoling Sep 9, 2019
cf18c2b
[AutoPR] reservations/resource-manager (#6861)
AutorestCI Sep 9, 2019
c9f3e9c
setting a maxparallel paramter for the storage livetests. we need to …
scbedd Sep 9, 2019
dcaa3c2
Enable SSO on Windows (#7006)
chlowell Sep 9, 2019
54a1af0
adjusting where inconsistency is set. if we are inconsistent, but the…
scbedd Sep 10, 2019
34b1cba
revert changes to doc build host machine. we need to push some docs o…
scbedd Sep 10, 2019
ee0f3b7
Fix tracing if method raise exception (#7133)
lmazuel Sep 10, 2019
ce6484e
fix link to azure-identity readme (#7169)
chlowell Sep 10, 2019
5a6764d
Eventhubs preview3 documentation update (#7139)
YijunXieMS Sep 10, 2019
ad4a001
msal_extensions -> msal-extensions (#7172)
chlowell Sep 10, 2019
3037d37
update doc (#7131)
xiangyan99 Sep 10, 2019
a267b95
[Cosmos] Preview2 (#7140)
annatisch Sep 10, 2019
2aa33cf
Key Vault: added example and fixed link in Certificates README (#7151)
iscai-msft Sep 10, 2019
475545f
Key Vault: fixed certificate docstring errors (#7132)
iscai-msft Sep 10, 2019
2b6068b
Key Vault: added certificate changelog (#7128)
iscai-msft Sep 10, 2019
fe4c62a
remove duplicate enum key (#7173)
kayousef Sep 10, 2019
90fe8d9
azure-keyvault-nspkg (#7125)
chlowell Sep 10, 2019
c433e47
Storage Preview 3 Release (#7154)
rakshith91 Sep 10, 2019
b3790cd
update readme and history (#7188)
Sep 11, 2019
7354bbd
Skip Building on incompatible Python Versions (#7160)
scbedd Sep 11, 2019
ab3f145
Disable dev-setup "Develop" mode in CI checks (#7162)
scbedd Sep 11, 2019
59e24d1
Eventhubs preview3 doc update
yunhaoling Sep 11, 2019
dc84cca
Final Key Vault 4.0.0b3 updates (#7189)
chlowell Sep 11, 2019
3c5304d
add cryptography dependency (#7207)
chlowell Sep 11, 2019
21d1741
Eventhubs blobstorage merge to master (#7150)
YijunXieMS Sep 11, 2019
1016d17
Increment Key Vault versions (#7211)
chlowell Sep 11, 2019
26319a8
Increment azure-identity version (#7176)
chlowell Sep 11, 2019
758f358
Doc build resolution for extension package (#7217)
scbedd Sep 11, 2019
21c62d7
removing stray == (#7218)
scbedd Sep 11, 2019
b30de5a
handle 0 packages being passed to dev_setup from setup_execute_tests.…
scbedd Sep 11, 2019
fc0d440
adding line item entry (#7221)
scbedd Sep 11, 2019
483a334
KeyVault: Removing JsonWeb prefix from enums (#7212)
iscai-msft Sep 11, 2019
c3fece1
Eventhubs blobstorage docs update (#7216)
YijunXieMS Sep 12, 2019
fdf78d5
fixed certificates 4.0.0b3 changelog (#7214)
iscai-msft Sep 12, 2019
58e3bf1
[cognitive-services] cog services devtools test framework (#7087)
kristapratico Sep 12, 2019
1caeded
Key Vault: reworked certificates samples, all passing (#7225)
iscai-msft Sep 12, 2019
3a97e09
adding azure-eventhubs to the exception list. should result in what w…
scbedd Sep 12, 2019
977cbda
add ability to specify job timeout (#7237)
danieljurek Sep 12, 2019
56c39bb
Cosmos Pipeline Refactor (#7227)
danieljurek Sep 12, 2019
54c452f
Fix spelling mistakes in cosmos_db.py (#6980)
James-DBA-Anderson Sep 12, 2019
71c31c4
Fix doc link (#6458)
jongio Sep 12, 2019
d1cf7e2
class links with extra text need :class: (#7215)
bryevdv Sep 12, 2019
16fca20
Key Vault: added certificate rst files to sphinx doc (#7248)
iscai-msft Sep 12, 2019
d73d926
Address nspkg Failures (#7243)
scbedd Sep 12, 2019
a1c2a91
Update Dependency Script to Key of Package Name for SDIST, update ove…
scbedd Sep 13, 2019
71e62fa
Un-use deprecated method in devtools (#7222)
Sep 13, 2019
2a0c6c3
[AutoPR compute/resource-manager] added missing packages to compute r…
AutorestCI Sep 16, 2019
fa91e4e
Fix error creating EnvironmentCredential with username/password (#7260)
chlowell Sep 16, 2019
5038f0b
update sphinx sources for certificates (#7290)
scbedd Sep 16, 2019
e461f03
Resolve faulty package filter when building for release (#7297)
scbedd Sep 16, 2019
ededddf
Read env variables and not settings if available (#7101)
lmazuel Sep 16, 2019
225f0e3
update requirements versions and fix breaks
danieljurek Sep 13, 2019
d2c001e
update to September 2019 release
danieljurek Sep 13, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[cognitive-services] cog services devtools test framework (#7087)
* cog sci test framework

* wait for account creation

* add fixme for luis authoring key

* have mgmt testcase inherit from azure testcase

* move text analytics to new test framework

* add back code in constructor for mgmt testcase
  • Loading branch information
kristapratico authored Sep 12, 2019
commit 58e3bf101ca74483d89d29cd8a8bc979cd4d368e
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
-e ../../../tools/azure-sdk-tools
-e ../../../tools/azure-sdk-tools
-e ../azure-mgmt-cognitiveservices

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
interactions:
- request:
body: '{"documents": [{"id": "1", "text": "I had a wonderful experience! The rooms
were wonderful and the staff was helpful."}]}'
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
Content-Length:
- '121'
Content-Type:
- application/json; charset=utf-8
User-Agent:
- python/3.7.3 (Windows-10-10.0.18362-SP0) msrest/0.6.6 azure-cognitiveservices-language-textanalytics/0.2.0
X-BingApis-SDK-Client:
- Python-SDK
method: POST
uri: https://westus.api.cognitive.microsoft.com/text/analytics/v2.1/languages
response:
body:
string: '{"documents":[{"id":"1","detectedLanguages":[{"name":"English","iso6391Name":"en","score":1.0}]}],"errors":[]}'
headers:
apim-request-id:
- 79422b97-439d-4042-b2ca-0053d00770d3
content-type:
- application/json; charset=utf-8
csp-billing-usage:
- CognitiveServices.TextAnalytics.BatchScoring|1
date:
- Mon, 09 Sep 2019 21:55:42 GMT
strict-transport-security:
- max-age=31536000; includeSubDomains; preload
transfer-encoding:
- chunked
x-aml-ta-request-id:
- f34d7b3c-5552-4b8e-89e0-164e129c66ac
x-content-type-options:
- nosniff
x-ms-transaction-count:
- '1'
status:
code: 200
message: OK
version: 1
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,18 @@
# --------------------------------------------------------------------------

from azure.cognitiveservices.language.textanalytics import TextAnalyticsClient
from msrest.authentication import CognitiveServicesCredentials

from azure_devtools.scenario_tests import ReplayableTest, AzureTestError
from devtools_testutils import ResourceGroupPreparer
from devtools_testutils.cognitiveservices_testcase import CognitiveServiceTest, CognitiveServicesAccountPreparer

from devtools_testutils import mgmt_settings_fake as fake_settings

class TextAnalyticsTest(CognitiveServiceTest):

class TextAnalyticsTest(ReplayableTest):
FILTER_HEADERS = ReplayableTest.FILTER_HEADERS + ['Ocp-Apim-Subscription-Key']
@ResourceGroupPreparer()
@CognitiveServicesAccountPreparer(name_prefix="pycog")
def test_detect_language(self, resource_group, location, cognitiveservices_account, cognitiveservices_account_key):
text_analytics = TextAnalyticsClient(cognitiveservices_account, cognitiveservices_account_key)

def __init__(self, method_name):
self._fake_settings, self._real_settings = self._load_settings()
super(TextAnalyticsTest, self).__init__(method_name)

@property
def settings(self):
if self.is_live:
if self._real_settings:
return self._real_settings
else:
raise AzureTestError('Need a mgmt_settings_real.py file to run tests live.')
else:
return self._fake_settings

def _load_settings(self):
try:
from devtools_testutils import mgmt_settings_real as real_settings
return fake_settings, real_settings
except ImportError:
return fake_settings, None

def test_detect_language(self):
credentials = CognitiveServicesCredentials(
self.settings.CS_SUBSCRIPTION_KEY
)
text_analytics = TextAnalyticsClient(endpoint="https://westcentralus.api.cognitive.microsoft.com", credentials=credentials)
response = text_analytics.detect_language(
documents=[{
'id': 1,
Expand Down
2 changes: 2 additions & 0 deletions tools/azure-sdk-tools/devtools_testutils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from .mgmt_testcase import (AzureMgmtTestCase, AzureMgmtPreparer)
from .azure_testcase import AzureTestCase
from .resource_testcase import (FakeResource, ResourceGroupPreparer)
from .storage_testcase import (FakeStorageAccount, StorageAccountPreparer)

__all__ = [
'AzureMgmtTestCase', 'AzureMgmtPreparer',
'FakeResource', 'ResourceGroupPreparer',
'FakeStorageAccount', 'StorageAccountPreparer',
'AzureTestCase',
]
155 changes: 155 additions & 0 deletions tools/azure-sdk-tools/devtools_testutils/azure_testcase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#-------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
#--------------------------------------------------------------------------

import inspect
import os.path
import zlib

from azure_devtools.scenario_tests import (
ReplayableTest, AzureTestError,
GeneralNameReplacer, RequestUrlNormalizer,
)

from .config import TEST_SETTING_FILENAME
from . import mgmt_settings_fake as fake_settings


class HttpStatusCode(object):
OK = 200
Created = 201
Accepted = 202
NoContent = 204
NotFound = 404


def get_resource_name(name_prefix, identifier):
# Append a suffix to the name, based on the fully qualified test name
# We use a checksum of the test name so that each test gets different
# resource names, but each test will get the same name on repeat runs,
# which is needed for playback.
# Most resource names have a length limit, so we use a crc32
checksum = zlib.adler32(identifier) & 0xffffffff
name = '{}{}'.format(name_prefix, hex(checksum)[2:]).rstrip('L')
if name.endswith('L'):
name = name[:-1]
return name


def get_qualified_method_name(obj, method_name):
# example of qualified test name:
# test_mgmt_network.test_public_ip_addresses
_, filename = os.path.split(inspect.getsourcefile(type(obj)))
module_name, _ = os.path.splitext(filename)
return '{0}.{1}'.format(module_name, method_name)


class AzureTestCase(ReplayableTest):
def __init__(self, method_name, config_file=None,
recording_dir=None, recording_name=None,
recording_processors=None, replay_processors=None,
recording_patches=None, replay_patches=None):
self.working_folder = os.path.dirname(__file__)
self.qualified_test_name = get_qualified_method_name(self, method_name)
self._fake_settings, self._real_settings = self._load_settings()
self.scrubber = GeneralNameReplacer()
config_file = config_file or os.path.join(self.working_folder, TEST_SETTING_FILENAME)
if not os.path.exists(config_file):
config_file = None
super(AzureTestCase, self).__init__(
method_name,
config_file=config_file,
recording_dir=recording_dir,
recording_name=recording_name or self.qualified_test_name,
recording_processors=recording_processors or self._get_recording_processors(),
replay_processors=replay_processors or self._get_replay_processors(),
recording_patches=recording_patches,
replay_patches=replay_patches,
)

@property
def settings(self):
if self.is_live:
if self._real_settings:
return self._real_settings
else:
raise AzureTestError('Need a mgmt_settings_real.py file to run tests live.')
else:
return self._fake_settings

def _load_settings(self):
try:
from . import mgmt_settings_real as real_settings
return fake_settings, real_settings
except ImportError:
return fake_settings, None

def _get_recording_processors(self):
return [
self.scrubber,
RequestUrlNormalizer()
]

def _get_replay_processors(self):
return [
RequestUrlNormalizer()
]

def is_playback(self):
return not self.is_live


def setUp(self):
# Every test uses a different resource group name calculated from its
# qualified test name.
#
# When running all tests serially, this allows us to delete
# the resource group in teardown without waiting for the delete to
# complete. The next test in line will use a different resource group,
# so it won't have any trouble creating its resource group even if the
# previous test resource group hasn't finished deleting.
#
# When running tests individually, if you try to run the same test
# multiple times in a row, it's possible that the delete in the previous
# teardown hasn't completed yet (because we don't wait), and that
# would make resource group creation fail.
# To avoid that, we also delete the resource group in the
# setup, and we wait for that delete to complete.
super(AzureTestCase, self).setUp()

def tearDown(self):
return super(AzureTestCase, self).tearDown()

def create_basic_client(self, client_class, **kwargs):
# Whatever the client, if credentials is None, fail
with self.assertRaises(ValueError):
client = client_class(
credentials=None,
**kwargs
)

# Real client creation
client = client_class(
credentials=self.settings.get_credentials(),
**kwargs
)
if self.is_playback():
client.config.long_running_operation_timeout = 0
client.config.enable_http_logger = True
return client

def create_random_name(self, name):
return get_resource_name(name, self.qualified_test_name.encode())

def get_resource_name(self, name):
"""Alias to create_random_name for back compatibility."""
return self.create_random_name(name)

def get_preparer_resource_name(self, prefix):
"""Random name generation for use by preparers.

If prefix is a blank string, use the fully qualified test name instead.
This is what legacy tests do for resource groups."""
return self.get_resource_name(prefix or self.qualified_test_name.replace('.', '_'))
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# --------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
import time
from collections import namedtuple
from azure_devtools.scenario_tests import ReplayableTest
from devtools_testutils import AzureTestCase
from azure_devtools.scenario_tests.exceptions import AzureTestError

from . import AzureMgmtPreparer, ResourceGroupPreparer
from .resource_testcase import RESOURCE_GROUP_PARAM

from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient
from msrest.authentication import CognitiveServicesCredentials

FakeCognitiveServicesAccount = namedtuple(
'FakeResource',
['endpoint']
)


class CognitiveServiceTest(AzureTestCase):
FILTER_HEADERS = ReplayableTest.FILTER_HEADERS + ['Ocp-Apim-Subscription-Key']

def __init__(self, method_name):
super(CognitiveServiceTest, self).__init__(method_name)


class CognitiveServicesAccountPreparer(AzureMgmtPreparer):
def __init__(self,
name_prefix='',
sku='S0', location='westus', kind='cognitiveservices',
parameter_name='cognitiveservices_account',
resource_group_parameter_name=RESOURCE_GROUP_PARAM,
disable_recording=True, playback_fake_resource=None,
client_kwargs=None):
super(CognitiveServicesAccountPreparer, self).__init__(name_prefix, 24,
disable_recording=disable_recording,
playback_fake_resource=playback_fake_resource,
client_kwargs=client_kwargs)
self.location = location
self.sku = sku
self.kind = kind
self.resource_group_parameter_name = resource_group_parameter_name
self.parameter_name = parameter_name
self.cogsci_key = ''

def create_resource(self, name, **kwargs):
if self.is_live:
self.client = self.create_mgmt_client(CognitiveServicesManagementClient)
group = self._get_resource_group(**kwargs)
cogsci_account = self.client.accounts.create(
group.name,
name,
parameters=
{
'sku': {'name': self.sku},
'location': self.location,
'kind': self.kind,
'properties': {}
}
)
time.sleep(5) # it takes a few seconds to create a cognitive services account
self.resource = cogsci_account
self.cogsci_key = self.client.accounts.list_keys(group.name, name).key1
# FIXME: LuisAuthoringClient and LuisRuntimeClient need authoring key from ARM API (coming soon-ish)
else:
self.resource = FakeCognitiveServicesAccount("https://{}.api.cognitive.microsoft.com".format(self.location))
self.cogsci_key = 'ZmFrZV9hY29jdW50X2tleQ=='
return {
self.parameter_name: self.resource.endpoint,
'{}_key'.format(self.parameter_name): CognitiveServicesCredentials(self.cogsci_key),
}

def remove_resource(self, name, **kwargs):
if self.is_live:
group = self._get_resource_group(**kwargs)
self.client.accounts.delete(group.name, name, polling=False)

def _get_resource_group(self, **kwargs):
try:
return kwargs.get(self.resource_group_parameter_name)
except KeyError:
template = 'To create a storage account a resource group is required. Please add ' \
'decorator @{} in front of this storage account preparer.'
raise AzureTestError(template.format(ResourceGroupPreparer.__name__))
Loading