blob: 1fc202961287daa81596fb3afc6c6f047cf44984 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright (c) 2017-2018 Nest Labs, Inc.
# Copyright (c) 2019-2020 Google, LLC.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# @file
# Acts a wrapper for WeaveDeviceMgr.py
#
from __future__ import absolute_import
from __future__ import print_function
import random
import os
import sys
import optparse
from optparse import OptionParser, Option, OptionValueError
from copy import copy
import shlex
import base64
import json
import logging
weaveDeviceMgrPath = os.environ['WEAVE_DEVICE_MGR_PATH']
print('weaveDeviceMgrPath is %s' % weaveDeviceMgrPath)
if os.path.exists(weaveDeviceMgrPath):
sys.path.append(weaveDeviceMgrPath)
try:
from openweave import WeaveStack
except Exception as ex:
print(("Failed to import WeaveStack: %s" % (str(ex))))
try:
from openweave import WeaveDeviceMgr
except Exception as ex:
print(("Failed to import WeaveDeviceMgr: %s" % (str(ex))))
try:
from openweave import WdmClient
except Exception as ex:
print(("Failed to import WdmClient: %s" % (str(ex))))
try:
from openweave import GenericTraitUpdatableDataSink
except Exception as ex:
print(("Failed to import GenericTraitUpdatableDataSink: %s" % (str(ex))))
try:
from openweave import ResourceIdentifier
except Exception as ex:
print(("Failed to import ResourceIdentifier: %s" % (str(ex))))
# Dummy Access Token
#
# The following fabric access token contains the dummy account certificate and
# private key described above. This can be used to authenticate to the mock device
# when it has been configured to use the dummy service config.
#
dummyAccessToken = (
"1QAABAAJADUBMAEITi8yS0HXOtskAgQ3AyyBEERVTU1ZLUFDQ09VTlQtSUQYJgTLqPobJgVLNU9C" +
"NwYsgRBEVU1NWS1BQ0NPVU5ULUlEGCQHAiYIJQBaIzAKOQQr2dtaYu+6sVMqD5ljt4owxYpBKaUZ" +
"TksL837axemzNfB1GG1JXYbERCUHQbTTqe/utCrWCl2d4DWDKQEYNYIpASQCBRg1hCkBNgIEAgQB" +
"GBg1gTACCEI8lV9GHlLbGDWAMAIIQjyVX0YeUtsYNQwwAR0AimGGYj0XstLP0m05PeQlaeCR6gVq" +
"dc7dReuDzzACHHS0K6RtFGW3t3GaWq9k0ohgbrOxoDHKkm/K8kMYGDUCJgElAFojMAIcuvzjT4a/" +
"fDgScCv5oxC/T5vz7zAPpURNQjpnajADOQQr2dtaYu+6sVMqD5ljt4owxYpBKaUZTksL837axemz" +
"NfB1GG1JXYbERCUHQbTTqe/utCrWCl2d4BgY"
)
DUMMY_WHERE_ID = '00000000-0000-0000-0000-000100000010'
DUMMY_SOPKEN_WHERE_ID = '00000000-0000-0000-0000-000100000010'
DUMMY_PAIRING_TOKEN = 'wu.WSmLH13lliU5zigrDm97vMjCBZUfHaFKyADQ/zRIkFjYjAJqrowWPkem7BrLXFg+HXz/iLIVj3TUHnRnZR2oNwZ2GfE='
DUMMY_SERVICE_CONFIG = '1QAADwABADYBFTABCQCoNCLp2XXkVSQCBDcDJxMBAADu7jC0GBgmBJUjqRkmBRXB0iw3BicTAQAA7u4wtBgYJAcCJggVAFojMAoxBHhS4pySunAZWEZtrhhySvtDDfYHKTMNYVXlZUaOug2lP7UXwEdkRAIYT6gRJFDUezWDKQEpAhg1gikBJAJgGDWBMAIIQgys9rRkceYYNYAwAghCDKz2tGRx5hg1DDABGQC+DtqhY1qO8VIXRYC93JQS1MwcLDNOKdwwAhkAi+fuLhEXFK6S2is7bS/XXZ5fzbi6L2V2GBgVMAEISOhQ0KHHNVskAgQ3AywBCDIxMjQ1NTMwGCYEBmDKHiYFBgnwMTcGLAEIMjEyNDU1MzAYJAcCJgglAFojMAo5BO2ka2bbHvtdCvtFIlELBnMxQYPbwKhJDE4FTZniehBCcYYhx+Z7ri5ncS22cjquARSKRCtNiANBNYMpARg1gikBJAIFGDWEKQE2AgQCBAEYGDWBMAIISBQYVpi13ycYNYAwAghIFBhWmLXfJxg1DDABHEmDxQmEkb6YJ+IYd2YLLxiYmxVH4pmFQXEd31MwAh0Ax2vFnMwPHZtC83XtjuAhofJJsbY99BXA+0lzFxgYGDUCJwEBAAAAAjC0GDYCFSwBImZyb250ZG9vci5pbnRlZ3JhdGlvbi5uZXN0bGFicy5jb20lAlcrGBgYGA=='
DUMMY_INIT_DATA = '{where_id: 00000000-0000-0000-0000-000100000010, structure_id: 8ae7af80-f152-11e5-ae52-22000b1905e2, spoken_where_id: 00000000-0000-0000-0000-000100000010}'
def DecodeBase64Option(option, opt, value):
try:
return base64.standard_b64decode(value)
except TypeError:
raise OptionValueError(
"option %s: invalid base64 value: %r" % (opt, value))
def DecodeHexIntOption(option, opt, value):
try:
return int(value, 16)
except ValueError:
raise OptionValueError(
"option %s: invalid value: %r" % (opt, value))
def parseNetworkId(value):
if (value == '$last-network-id' or value == '$last'):
if (lastNetworkId != None):
return lastNetworkId
else:
print("No last network id")
return None
try:
return int(value)
except ValueError:
print("Invalid network id")
return None
class MockWeaveDataManagementClientImp():
def __init_(self):
self.wdmClient = None
def createWdmClient(self):
try:
self.wdmClient = WdmClient.WdmClient()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def closeWdmClient(self):
try:
if self.wdmClient:
self.wdmClient.close()
self.wdmClient = None
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
print("close wdm client complete")
def setNodeId(self, val):
try:
if self.wdmClient:
self.wdmClient.setNodeId(val)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
print("close wdm client complete")
def newDataSink(self, statusProfileId, instanceid, path, testResOption="default"):
"""
new-data-sink <statusProfileId, instanceid, path>
"""
if self.wdmClient == None:
print("wdmclient not initialized")
return
if testResOption == "default" :
resourceIdentifier = ResourceIdentifier.ResourceIdentifier()
elif testResOption == "ResTypeIdInt":
resourceIdentifier = ResourceIdentifier.ResourceIdentifier.MakeResTypeIdInt(0, -2)
elif testResOption == "ResTypeIdBytes":
resourceIdentifier = ResourceIdentifier.ResourceIdentifier.MakeResTypeIdBytes(0, b'\xfe\xff\xff\xff\xff\xff\xff\xff')
try:
traitInstance = self.wdmClient.newDataSink(resourceIdentifier, statusProfileId, instanceid, path)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
print("new data sink complete")
return traitInstance
def flushUpdate(self):
if self.wdmClient == None:
print("wdmclient not initialized")
return
try:
result = self.wdmClient.flushUpdate()
print("flushUpdate Complete")
print(result)
return result
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def refreshData(self):
if self.wdmClient == None:
print("wdmclient not initialized")
return
try:
result = self.wdmClient.refreshData()
print("refresh trait data complete")
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def refreshIndividualData(self, traitInstance):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
result = traitInstance.refreshData()
print("refresh individual trait data complete")
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def closeIndividualTrait(self, traitInstance):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
traitInstance.close()
print("close current trait")
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def setData(self, traitInstance, path, value):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
isConditional = False
try:
val = ast.literal_eval(args[1])
except:
val = value
try:
traitInstance.setData(path, val, isConditional)
print("set string data in trait complete")
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def getData(self, traitInstance, path):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
val = traitInstance.getData(path)
print("get data in trait complete")
print(val)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def getVersion(self, traitInstance):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
val = traitInstance.getVersion()
print(val)
return val
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def clearTrait(self, traitInstance):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
traitInstance.clear()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def deleteData(self, traitInstance, path):
if self.wdmClient == None or traitInstance == None:
print("wdmclient or traitInstance not initialized")
return
try:
traitInstance.deleteData(path)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
return
def testWdmClientCreateClose(testObject):
testObject.createWdmClient()
testObject.closeWdmClient()
print("testWdmClientCreationClose completes")
def testWdmClientDataSinkCreateClose(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.closeWdmClient()
print("testWdmClientDataSinkCreateClose completes")
def testWdmClientDataSinkEmptyFlushData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
results = testObject.flushUpdate()
testObject.closeWdmClient()
print("testWdmClientDataSinkEmptyFlushData completes")
def testWdmClientDataSinkSetFlushData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
results = testObject.flushUpdate()
testObject.closeWdmClient()
print("testWdmClientDataSinkSetFlushData completes")
def testWdmClientDataSinkSetFlushInvalidData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", 0.1)
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", b"TESTTEST")
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
results1 = testObject.flushUpdate()
if len(results1) != 2:
raise ValueError("testWdmClientDataSinkSetFlushInvalidData stage1 fails")
print("testWdmClientDataSinkSetFlushInvalidData stage1 completes")
results2 = testObject.flushUpdate()
if len(results2) != 0:
raise ValueError("testWdmClientDataSinkSetFlushInvalidData stage2 fails")
print("testWdmClientDataSinkSetFlushInvalidData stage2 completes")
for ele in results1:
print("clear trait: " + str(ele.dataSink.profileId))
print("clear trait path:" + str(ele.path))
testObject.deleteData(ele.dataSink, ele.path.encode('utf8'))
results3 = testObject.flushUpdate()
if len(results3) != 0:
raise ValueError("testWdmClientDataSinkSetFlushInvalidData stage3 fails")
testObject.setData(TestCTrait, b"/4", 20)
results4 = testObject.flushUpdate()
if len(results4) != 0:
raise ValueError("testWdmClientDataSinkSetFlushInvalidData stage4 fails")
testObject.closeWdmClient()
print("testWdmClientDataSinkSetFlushInvalidData completes")
def testWdmClientDataSinkSetFlushDataDeleteData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.deleteData(localeSettingsTrait, b"/1")
testObject.deleteData(TestCTrait, b"/1")
testObject.deleteData(TestCTrait, b"/2")
testObject.deleteData(TestCTrait, b"/3/1")
testObject.deleteData(TestCTrait, b"/3/2")
results = testObject.flushUpdate()
testObject.closeWdmClient()
print("testWdmClientDataSinkSetFlushDataDeleteData completes")
def testWdmClientDataSinkSetClearFlushData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.clearTrait(localeSettingsTrait)
testObject.clearTrait(TestCTrait)
results = testObject.flushUpdate()
testObject.closeWdmClient()
print("testWdmClientDataSinkSetClearFlushData completes")
def testWdmClientDataSinkRefreshIndividualGetDataRefresh(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.refreshIndividualData(localeSettingsTrait)
testObject.getData(localeSettingsTrait, b"/1")
testObject.refreshIndividualData(TestCTrait)
TestCTraitVersion = testObject.getVersion(TestCTrait)
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
testObject.refreshIndividualData(TestCTrait)
TestCTraitVersion = testObject.getVersion(TestCTrait)
testObject.closeWdmClient()
print("testWdmClientDataSinkRefreshIndividualGetDataRefresh completes")
def testWdmClientDataSinkRefreshGetDataRefresh(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
refreshResults1 = testObject.refreshData()
localeSettingsTraitVersion = testObject.getVersion(localeSettingsTrait)
TestCTraitVersion = testObject.getVersion(TestCTrait)
testObject.getData(localeSettingsTrait, b"/1")
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
refreshResults2 = testObject.refreshData()
localeSettingsTraitVersion = testObject.getVersion(localeSettingsTrait)
TestCTraitVersion = testObject.getVersion(TestCTrait)
testObject.closeWdmClient()
print("testWdmClientDataSinkRefreshGetDataRefresh completes")
def testWdmClientDataSinkCloseIndividualData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
refreshResults1 = testObject.refreshIndividualData(localeSettingsTrait)
testObject.closeIndividualTrait(localeSettingsTrait)
refreshResults2 = testObject.refreshIndividualData(TestCTrait)
testObject.closeIndividualTrait(TestCTrait)
testObject.closeWdmClient()
print("testWdmClientDataSinkCloseIndividualData completes")
def testWdmClientDataSinkSetFlushRefreshGetData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
localeCapabilitiesTrait = testObject.newDataSink(21, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(localeCapabilitiesTrait, b"/2", [b"en-US", b"zh-TW"])
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.flushUpdate()
testObject.refreshData()
testObject.getData(localeSettingsTrait, b"/1")
testObject.getData(localeCapabilitiesTrait, b"/2")
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
testObject.closeWdmClient()
print("testWdmClientDataSinkSetFlushRefreshGetData completes")
def testWdmClientDataSinkSetRefreshFlushGetData(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.refreshData()
testObject.flushUpdate()
testObject.getData(localeSettingsTrait, b"/1")
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
testObject.closeWdmClient()
print("testWdmClientDataSinkSetRefreshFlushGetData completes")
def testWdmClientDataSinkResourceIdentifierMakeResTypeIdInt(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 0, b"/", "ResTypeIdInt")
TestCTrait = testObject.newDataSink(593165827, 0, b"/", "ResTypeIdInt")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.flushUpdate()
testObject.refreshData()
testObject.getData(localeSettingsTrait, b"/1")
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
testObject.closeWdmClient()
print("testWdmClientDataSinkResourceIdentifierMakeResTypeIdInt completes")
def testWdmClientDataSinkResourceIdentifierMakeResTypeIdBytes(testObject):
testObject.createWdmClient()
testObject.setNodeId(-2)
localeSettingsTrait = testObject.newDataSink(20, 0, b"/", "ResTypeIdBytes")
TestCTrait = testObject.newDataSink(593165827, 0, b"/", "ResTypeIdBytes")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
testObject.flushUpdate()
testObject.refreshData()
testObject.getData(localeSettingsTrait, b"/1")
testObject.getData(TestCTrait, b"/1")
testObject.getData(TestCTrait, b"/2")
testObject.getData(TestCTrait, b"/3/1")
testObject.getData(TestCTrait, b"/3/2")
testObject.getData(TestCTrait, b"/4")
testObject.closeWdmClient()
print("testWdmClientDataSinkResourceIdentifierMakeResTypeIdBytes completes")
def testWdmClientDataSinkSetFlushInvalidInstanceId(testObject):
testObject.createWdmClient()
localeSettingsTrait = testObject.newDataSink(20, 1, b"/")
TestCTrait = testObject.newDataSink(593165827, 0, b"/")
testObject.setData(localeSettingsTrait, b"/1", b"en-US")
testObject.setData(TestCTrait, b"/1", False)
testObject.setData(TestCTrait, b"/2", 15)
testObject.setData(TestCTrait, b"/3/1", 16)
testObject.setData(TestCTrait, b"/3/2", False)
testObject.setData(TestCTrait, b"/4", 17)
result = testObject.flushUpdate()
if len(result) != 1:
raise ValueError("testWdmClientDataSinkSetFlushInvalidInstanceId fails")
else:
if not (result[0].profileId == 0xb and result[0].statusCode == 0x21):
raise ValueError("testWdmClientDataSinkSetFlushInvalidInstanceId profileId and StatusCode check fails")
print("clear trait: " + str(result[0].dataSink.profileId))
print("clear trait path:" + str(result[0].path))
testObject.deleteData(result[0].dataSink, result[0].path.encode("utf-8"))
testObject.closeWdmClient()
print("testWdmClientDataSinkSetFlushInvalidInstanceId completes")
def RunWdmClientTest():
print("Run Weave Data Management Test")
testObject = MockWeaveDataManagementClientImp()
testWdmClientCreateClose(testObject)
testWdmClientDataSinkEmptyFlushData(testObject)
testWdmClientDataSinkCreateClose(testObject)
testWdmClientDataSinkSetFlushData(testObject)
testWdmClientDataSinkSetFlushInvalidData(testObject)
testWdmClientDataSinkSetFlushDataDeleteData(testObject)
testWdmClientDataSinkSetClearFlushData(testObject)
testWdmClientDataSinkSetFlushRefreshGetData(testObject)
testWdmClientDataSinkRefreshGetDataRefresh(testObject)
testWdmClientDataSinkRefreshIndividualGetDataRefresh(testObject)
testWdmClientDataSinkCloseIndividualData(testObject)
testWdmClientDataSinkSetRefreshFlushGetData(testObject)
testWdmClientDataSinkResourceIdentifierMakeResTypeIdInt(testObject)
testWdmClientDataSinkResourceIdentifierMakeResTypeIdBytes(testObject)
testWdmClientDataSinkSetFlushInvalidInstanceId(testObject)
print("Run Weave Data Management Complete")
class ExtendedOption (Option):
TYPES = Option.TYPES + ("base64", "hexint", )
TYPE_CHECKER = copy(Option.TYPE_CHECKER)
TYPE_CHECKER["base64"] = DecodeBase64Option
TYPE_CHECKER["hexint"] = DecodeHexIntOption
if __name__ == '__main__':
# Override the default logging for WeaveStack to include timestamps.
weaveStackLogger = logging.getLogger('openweave.WeaveStack')
logHandler = logging.StreamHandler(stream=sys.stdout)
logHandler.setFormatter(WeaveStack.WeaveLogFormatter(logTimestamp=True))
weaveStackLogger.addHandler(logHandler)
weaveStackLogger.setLevel(logging.DEBUG)
devMgr = WeaveDeviceMgr.WeaveDeviceManager()
cmdLine = " ".join(sys.argv[1:])
args = shlex.split(cmdLine)
optParser = OptionParser(usage=optparse.SUPPRESS_USAGE, option_class=ExtendedOption)
print("Connecting to device ...")
print('')
print('#################################connect#################################')
optParser.add_option("", "--pairing-code", action="store", dest="pairingCode", type="string")
optParser.add_option("", "--access-token", action="store", dest="accessToken", type="base64")
optParser.add_option("", "--use-dummy-access-token", action="store_true", dest="useDummyAccessToken")
optParser.add_option("", "--ble", action="store_true", dest="useBle")
optParser.add_option("", "--account-id", action="store", dest="account_id")
optParser.add_option("", "--service-config", action="store", dest="service_config")
optParser.add_option("", "--pairing-token", action="store", dest="pairing_token")
optParser.add_option("", "--init-data", action="store", dest="init_data")
optParser.add_option("", "--ble-src-addr", action="store", dest="bleSrcAddr")
optParser.add_option("", "--ble-dst-addr", action="store", dest="bleDstAddr")
try:
(options, remainingArgs) = optParser.parse_args(args)
except SystemExit:
exit()
if (len(remainingArgs) > 2):
print("Unexpected argument: " + remainingArgs[2])
exit()
if not options.useBle:
addr = remainingArgs[0]
remainingArgs.pop(0)
if (len(remainingArgs)):
nodeId = int(remainingArgs[0], 16)
remainingArgs.pop(0)
else:
nodeId = 1
if (options.useDummyAccessToken and not options.accessToken):
options.accessToken = base64.standard_b64decode(dummyAccessToken)
if (options.pairingCode and options.accessToken):
print("Cannot specify both pairing code and access token")
exit()
try:
if options.useBle:
from openweave.WeaveBluezMgr import BluezManager as BleManager
from openweave.WeaveBleUtility import FAKE_CONN_OBJ_VALUE
bleManager = BleManager(devMgr)
try:
bleManager.ble_adapter_select(identifier=options.bleSrcAddr)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
try:
line = ' ' + str(options.bleDstAddr)
bleManager.scan_connect(line)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
devMgr.ConnectBle(bleConnection=FAKE_CONN_OBJ_VALUE,
pairingCode=options.pairingCode,
accessToken=options.accessToken)
RunWdmClientTest()
try:
devMgr.Close()
devMgr.CloseEndpoints()
bleManager.disconnect()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("WoBLE central is good to go")
print("Shutdown complete")
exit()
else:
devMgr.ConnectDevice(deviceId=nodeId, deviceAddr=addr,
pairingCode=options.pairingCode,
accessToken=options.accessToken)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
if options.account_id is not None and options.service_config is not None and options.init_data is not None and options.pairing_token is not None:
print('')
print('#################################register-real-NestService#################################')
try:
devMgr.RegisterServicePairAccount(0x18B4300200000010, options.account_id, base64.b64decode(options.service_config), options.pairing_token, options.init_data)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
"""
#Disable unregister since the service automatically removes devices from accounts when they are paired again
print("Register NestService done")
print ''
print '#################################unregister-real-NestService#################################'
try:
devMgr.UnregisterService(0x18B4300200000010)
except WeaveStack.WeaveStackException, ex:
print str(ex)
exit()
print("Unregister service done")
"""
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Shutdown complete")
exit()
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################connect2#################################')
try:
devMgr.ConnectDevice(deviceId=nodeId, deviceAddr=addr)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################set-rendezvous-linklocal#################################')
try:
devMgr.SetRendezvousLinkLocal(0)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Done.")
print('#################################set-rendezvous-address#################################')
try:
devMgr.SetRendezvousAddress(addr)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Done.")
print('')
print('#################################set-connect-timeout#################################')
timeoutMS = 1000
try:
devMgr.SetConnectTimeout(timeoutMS)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Done.")
print('')
print('#################################rendezvous1#################################')
try:
devMgr.RendezvousDevice(
accessToken=options.accessToken,
targetFabricId=WeaveDeviceMgr.TargetFabricId_AnyFabric,
targetModes=WeaveDeviceMgr.TargetDeviceMode_Any,
targetVendorId=WeaveDeviceMgr.TargetVendorId_Any,
targetProductId=WeaveDeviceMgr.TargetProductId_Any,
targetDeviceId=WeaveDeviceMgr.TargetDeviceId_Any)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connected to device %X at %s" % (nodeId, addr))
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################rendezvous2#################################')
try:
devMgr.RendezvousDevice(
pairingCode=options.pairingCode,
targetFabricId=WeaveDeviceMgr.TargetFabricId_AnyFabric,
targetModes=WeaveDeviceMgr.TargetDeviceMode_Any,
targetVendorId=WeaveDeviceMgr.TargetVendorId_Any,
targetProductId=WeaveDeviceMgr.TargetProductId_Any,
targetDeviceId=WeaveDeviceMgr.TargetDeviceId_Any)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connected to device %X at %s" % (nodeId, addr))
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################rendezvous3#################################')
try:
devMgr.RendezvousDevice(
pairingCode=options.pairingCode)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connected to device %X at %s" % (nodeId, addr))
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################rendezvous4#################################')
try:
devMgr.RendezvousDevice()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connected to device %X at %s" % (nodeId, addr))
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################connect#################################')
try:
devMgr.ConnectDevice(deviceId=nodeId, deviceAddr=addr, pairingCode=options.pairingCode)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print('')
print('#################################set-rendezvous-mode#################################')
try:
devMgr.SetRendezvousMode(10)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Set rendezvous mode complete")
print('')
print('#################################arm-fail-safe#################################')
failSafeToken = random.randint(0, 2**32)
try:
devMgr.ArmFailSafe(1, failSafeToken)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Arm fail-safe complete, fail-safe token = " + str(failSafeToken))
try:
devMgr.ArmFailSafe(2, failSafeToken)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Arm fail-safe complete, fail-safe token = " + str(failSafeToken))
try:
devMgr.ArmFailSafe(3, failSafeToken)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Arm fail-safe complete, fail-safe token = " + str(failSafeToken))
print('')
print('#################################disarm-fail-safe#################################')
try:
devMgr.DisarmFailSafe()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Disarm fail-safe complete")
print('')
print('#################################reset-config#################################')
#Reset the device's configuration. <reset-flags> is an optional hex value specifying the type of reset to be performed.
resetFlags = 0x00FF
try:
devMgr.ResetConfig(resetFlags)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Reset config complete")
print('')
print('#################################set-auto-reconnect#################################')
autoReconnect = 1
try:
devMgr.SetAutoReconnect(autoReconnect)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Done.")
print('')
print('#################################set-log-output#################################')
category = 'detail'
if (category == 'none'):
category = 0
elif (category == 'error'):
category = 1
elif (category == 'progress'):
category = 2
elif (category == 'detail'):
category = 3
try:
devMgr.SetLogFilter(category)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Done.")
RunWdmClientTest()
print('')
print('#################################scan-network#################################')
try:
networkType = WeaveDeviceMgr.ParseNetworkType("wifi")
scanResult = devMgr.ScanNetworks(networkType)
except WeaveStack.WeaveStackException as ex:
print(ex)
print("ScanNetworks complete, %d network(s) found" % (len(scanResult)))
i = 1
for net in scanResult:
print(" Network %d" % (i))
net.Print(" ")
i = i + 1
try:
networkType = WeaveDeviceMgr.ParseNetworkType("thread")
scanResult = devMgr.ScanNetworks(networkType)
except WeaveStack.WeaveStackException as ex:
print(ex)
print("ScanNetworks complete, %d network(s) found" % (len(scanResult)))
i = 1
for net in scanResult:
print(" Network %d" % (i))
net.Print(" ")
i = i + 1
print('')
print('#################################add-network#################################')
networkInfo = WeaveDeviceMgr.NetworkInfo(
networkType = WeaveDeviceMgr.NetworkType_WiFi,
wifiSSID = "Wireless-1",
wifiMode = WeaveDeviceMgr.WiFiMode_Managed,
wifiRole = WeaveDeviceMgr.WiFiRole_Station,
wifiSecurityType = WeaveDeviceMgr.WiFiSecurityType_None)
try:
addResult = devMgr.AddNetwork(networkInfo)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
lastNetworkId = addResult
print("Add wifi network complete (network id = " + str(addResult) + ")")
print('')
print('#################################update-network#################################')
# networkInfo = WeaveDeviceMgr.NetworkInfo(networkId=lastNetworkId)
networkInfo = WeaveDeviceMgr.NetworkInfo(
networkType = WeaveDeviceMgr.NetworkType_WiFi,
networkId=lastNetworkId,
wifiSSID = "Wireless-1",
wifiMode = WeaveDeviceMgr.WiFiMode_Managed,
wifiRole = WeaveDeviceMgr.WiFiRole_Station,
wifiSecurityType = WeaveDeviceMgr.WiFiSecurityType_None)
try:
devMgr.UpdateNetwork(networkInfo)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Update network complete")
print('')
print('#################################disable-network#################################')
try:
devMgr.DisableNetwork(lastNetworkId)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
print("Disable network complete")
print('')
print('#################################enable-network#################################')
try:
devMgr.EnableNetwork(lastNetworkId)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Enable network complete")
print('')
print('#################################test-network#################################')
try:
devMgr.TestNetworkConnectivity(lastNetworkId)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Network test complete")
print('')
print('#################################get-networks-without-credentials#################################')
try:
# Send a GetNetworks without asking for credentials
flags = 0
getResult = devMgr.GetNetworks(flags)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Get networks complete, %d network(s) returned" % (len(getResult)))
i = 1
for net in getResult:
print(" Network %d" % (i))
net.Print(" ")
i = i + 1
print('')
print('#################################get-networks-with-credentials#################################')
try:
# Send a GetNetworks asking for credentials: this is allowed only if the
# device thinks it's paired. (See the Weave Access Control specification)
kGetNetwork_IncludeCredentials = 1
flags = kGetNetwork_IncludeCredentials
getResult = devMgr.GetNetworks(flags)
except WeaveStack.WeaveStackException as ex:
print("expected Device Error: [ Common(00000000):20 ] Access denied")
print("caught " + str(ex))
if ex.profileId != 0 or ex.statusCode != 20:
exit()
print('')
print('#################################remove-network#################################')
try:
devMgr.RemoveNetwork(lastNetworkId)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Remove network complete")
print('')
print('#################################create-fabric#################################')
try:
devMgr.CreateFabric()
except WeaveStack.WeaveStackException as ex:
print('Already member of fabric')
print("Create fabric complete")
print('')
print('#################################get-fabric-configure#################################')
try:
fabricConfig = devMgr.GetFabricConfig()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Get fabric config complete")
print("Fabric configuration: ")
print(fabricConfig)
print('')
print('#################################leave-fabric#################################')
try:
devMgr.LeaveFabric()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Leave fabric complete")
print('')
print('#################################join-existing-fabric#################################')
try:
devMgr.JoinExistingFabric(fabricConfig)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Join existing fabric complete")
print('')
print('#################################identify#################################')
try:
deviceDesc = devMgr.IdentifyDevice()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Identify device complete")
deviceDesc.Print(" ")
print('')
print('#################################get-last-network-provisioning-result#################################')
try:
devMgr.GetLastNetworkProvisioningResult()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################get-wireless-reg-config#################################')
try:
getResult = devMgr.GetWirelessRegulatoryConfig()
except WeaveDeviceMgr.DeviceManagerException as ex:
print(str(ex))
exit()
print("GetWirelessRegulatoryConfig complete")
getResult.Print(" ")
print('')
print('#################################set-wireless-reg-config#################################')
try:
devMgr.SetWirelessRegulatoryConfig(WeaveDeviceMgr.WirelessRegConfig(regDomain="US"))
except WeaveDeviceMgr.DeviceManagerException as ex:
print(str(ex))
exit()
print("SetWirelessRegulatoryConfig complete")
print('')
print('#################################ping#################################')
try:
devMgr.Ping()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Ping complete")
print('')
print('#################################register-service#################################')
try:
devMgr.RegisterServicePairAccount(0x18B4300100000001, '21245530', base64.b64decode(DUMMY_SERVICE_CONFIG), DUMMY_PAIRING_TOKEN, DUMMY_INIT_DATA)
except WeaveStack.WeaveStackException as ex:
print(ex)
exit()
print("Register service complete")
print('')
print('#################################update-service#################################')
try:
devMgr.UpdateService(0x18B4300100000001, base64.b64decode(DUMMY_SERVICE_CONFIG))
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Update service complete")
print('')
print('#################################unregister-service#################################')
try:
devMgr.UnregisterService(0x18B4300100000001)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Unregister service complete")
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################reconnect#################################')
try:
devMgr.ReconnectDevice()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print('')
print('#################################enable-connection-monitor#################################')
interval = 5000
timeout = 1000
try:
devMgr.EnableConnectionMonitor(interval, timeout)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connection monitor enabled")
print('')
print('#################################disable-connection-monitor#################################')
try:
devMgr.DisableConnectionMonitor()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Connection monitor disabled")
print('')
print('#################################start-system-test#################################')
try:
devMgr.StartSystemTest(WeaveDeviceMgr.SystemTest_ProductList["thermostat"], 1)
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Start system test complete")
print('')
print('#################################stop-system-test#################################')
try:
devMgr.StopSystemTest()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Stop system test complete")
print('')
print('#################################pair-token#################################')
try:
tokenPairingBundle = devMgr.PairToken('Test')
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Pair token complete")
print("TokenPairingBundle: ")
print(tokenPairingBundle)
print('')
print('#################################unpair-token#################################')
try:
devMgr.UnpairToken()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Unpair token complete")
print('')
print('#################################close#################################')
try:
devMgr.Close()
devMgr.CloseEndpoints()
except WeaveStack.WeaveStackException as ex:
print(str(ex))
exit()
print("Shutdown complete")