Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use secure gRPC channels for spot_wrapper.testing mocks #103

Merged
merged 3 commits into from
Apr 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
version="1.0.0",
description="Wrapper for Boston Dynamics Spot SDK",
packages=find_packages(include=["spot_wrapper*"]),
package_data={"spot_wrapper.testing.credentials": ["*.crt", "*.pem"]},
install_requires=["bosdyn-client", "bosdyn-api", "bosdyn-mission", "bosdyn-core", "grpcio", "inflection", "pytest"],
)
31 changes: 31 additions & 0 deletions spot_wrapper/testing/credentials/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright (c) 2024 Boston Dynamics AI Institute LLC. See LICENSE file for more info.

import dataclasses
import pathlib
import typing

import pkg_resources


@dataclasses.dataclass
class SpotSSLCertificates:
root_certificate_path: pathlib.Path
robot_certificate_key_path: pathlib.Path
robot_certificate_paths: typing.Sequence[pathlib.Path]


DEFAULT_TESTING_CERTIFICATES = SpotSSLCertificates(
robot_certificate_key_path=pathlib.Path(
pkg_resources.resource_filename("spot_wrapper.testing.credentials", "robot.pem")
),
robot_certificate_paths=[
pathlib.Path(pkg_resources.resource_filename("spot_wrapper.testing.credentials", certificate_filename))
for certificate_filename in (
"api.spot.robot.crt",
"auth.spot.robot.crt",
"id.spot.robot.crt",
"payload-registration.spot.robot.crt",
)
],
root_certificate_path=pathlib.Path(pkg_resources.resource_filename("spot_wrapper.testing.credentials", "ca.crt")),
)
28 changes: 28 additions & 0 deletions spot_wrapper/testing/credentials/api.spot.robot.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIE0TCCArkCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg
Fw0yNDA0MTIxODEzMDVaGA8zMDIzMDgxNDE4MTMwNVowGTEXMBUGA1UEAwwOYXBp
LnNwb3Qucm9ib3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDafDjd
dyftz5pvGqphNphRSIX6/jTeH+l5sKGyVhC6d+k81GkRKptQ77XNtBovVg6SuE4O
i1poHwkGfvnODM6CEXb3MIBCKBpq8UNl+fP5DRnM1AksKVjRyq0kOELtNlWyfRuC
nhHYVT5XoVL99Wrb6RfUbdMSx4Iu7U+A0GUsatOvMXAK3IItifHNm1PYdggZP/Zw
Mrm6Xky7HGN7k9wf3FEmAEpPJcswvA/+x0GGQnAESNbsaE26n5MgVSm9e45l9z5R
4LtAyVnAYnuK7l2/5+brwBd70doq2cdmoyUxX2eK+91pojR2hVPe3avgoT0yYTvc
d+ykkaJWB5tKIHgTSNactN3DsZD//d0s6pOP0yiRPSbqmC6GsGnDhjqLRsa/D6D7
fc71Ymk+pv5WyHKB6Tl+q2j8eYkLYE8hCc0Y0F89Ph/yGG22CzW4v8tQrG+QLi/0
1AJjzGybYeyV5OpuRsMKUlqTOtEssR82gCMYk1Qbo8DGGPbztdL9GaViLrykmyX2
+j/On5RS0m4hSSIxCGuVjvYZz2oIvZbadRpnrIKCtwYLkkWXmGZi5YTlKDtHqlyt
i73FyOG0v+f6mCud2WxLncZ+4Db7dWGkO4z+pqtBfgv/wmb0/zY6oEpbX4dQchBo
/i8Zt4Lpjwi1fq9yvE32BAC4EuE4GyCjU8UoAwIDAQABMA0GCSqGSIb3DQEBCwUA
A4ICAQA1l7TjPgCgesqmX2iFsSndoIfS9FKrrOUdE0w7/2WxVKEhOe/DiGKZPBuL
t62sDBwtEEZsML3PAVvR8dP5HesKBFdj5U3sNwWk0epsXq2uiF15T3zM+YAvibwG
m5OBwcuB74oAKKJdimNeLvIo1oB99lt5Xx7irigqeqoIMw5ul4dntasOKuOm7hVS
X2rRJk0dWdiOwi7YuFIpB7Z1NtBAOqlZLzWIZoNC6EjXcWLba8E2Pp2T69aozkGB
/7JWTEtMdz2J4Qd3ADcUx8SAu5PbAJyyth+6B6+UWRRIbHkYMuL37udEuL77olQa
7gOSX/A8V0Xt8zUbHwl28Q8BafNcLQq7tOImZXTh0hv8hoOx970qLkaY4S9p8PKr
Gy4RokKHlzg42n4wUD0BQP2Clv8QjGgDTT/XT0oZcbXmbGXtb/psdMw5+dZtNk+u
MweA//HigOJ9CqCEpyaiO4obz6w5Kap6SCCAzZAOOPMWrRtMThGnCxXu9DHQJB1r
QJC/MQ/5hNmCoHZEH/5v22G6goC/2J9hHxbnF3irksC48vcgy/x0zfENi+q2c9cr
lH6oIB3Jfh8q9JgXaCU8B+kehIsyF6BzFBtUPN8csuY5+q/G4IuUUDCElWiOSSXK
u7LGAgftY9YWkTyNGVqflTuzuB2tSc6p3w+aBhtNcMISp6vF6w==
-----END CERTIFICATE-----
28 changes: 28 additions & 0 deletions spot_wrapper/testing/credentials/auth.spot.robot.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIE0jCCAroCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg
Fw0yNDA0MTIxODEzMTNaGA8zMDIzMDgxNDE4MTMxM1owGjEYMBYGA1UEAwwPYXV0
aC5zcG90LnJvYm90MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2nw4
3Xcn7c+abxqqYTaYUUiF+v403h/pebChslYQunfpPNRpESqbUO+1zbQaL1YOkrhO
DotaaB8JBn75zgzOghF29zCAQigaavFDZfnz+Q0ZzNQJLClY0cqtJDhC7TZVsn0b
gp4R2FU+V6FS/fVq2+kX1G3TEseCLu1PgNBlLGrTrzFwCtyCLYnxzZtT2HYIGT/2
cDK5ul5Muxxje5PcH9xRJgBKTyXLMLwP/sdBhkJwBEjW7GhNup+TIFUpvXuOZfc+
UeC7QMlZwGJ7iu5dv+fm68AXe9HaKtnHZqMlMV9nivvdaaI0doVT3t2r4KE9MmE7
3HfspJGiVgebSiB4E0jWnLTdw7GQ//3dLOqTj9MokT0m6pguhrBpw4Y6i0bGvw+g
+33O9WJpPqb+Vshygek5fqto/HmJC2BPIQnNGNBfPT4f8hhttgs1uL/LUKxvkC4v
9NQCY8xsm2HsleTqbkbDClJakzrRLLEfNoAjGJNUG6PAxhj287XS/RmlYi68pJsl
9vo/zp+UUtJuIUkiMQhrlY72Gc9qCL2W2nUaZ6yCgrcGC5JFl5hmYuWE5Sg7R6pc
rYu9xcjhtL/n+pgrndlsS53GfuA2+3VhpDuM/qarQX4L/8Jm9P82OqBKW1+HUHIQ
aP4vGbeC6Y8ItX6vcrxN9gQAuBLhOBsgo1PFKAMCAwEAATANBgkqhkiG9w0BAQsF
AAOCAgEADFU0YDJ/Uc7eQRzuj0fdH5tbpfk4bQo3hBu5PXX/ZNIe7q3vDs5iLyw+
zoJmESiBl06lBqvC7/E0DJZSc+zmUVe41e4e8g/ZqlIMPDI3hnc+HPS3NH/Wt/IG
OODUqthKvNZLxCJuiJ1hzAYxkQdQTgG+p2KtqF/FeuTGQva0OYqtUnfnwNf/eRt2
2TeAagoJFG1MpmP6hQsc9wUxE5Zz7Ro30VvwMQrhQDl2336x0CxncB/OVovikE1p
j7RhHIPvxfNj/KsSs4VZqxE2CnjOVsAcNIc0vkPeqKBOXmSq08s7ulZ/P3pyS7MI
lW9iG5XiPMYjCU/JkmZy7wREhEgLEMvfciQTAAUTDC7HpDOVezPU0c87xaV18Vzk
SucxtvkVqPD3ff8onG7qFVlop2ulHXVteaeTYsI0f41MS4z/GqfWjbUU9jd56HO5
ZB9+VE8cNe9TC+uZoJMUO2dHtMjj4GIRxSgVaefZP14RPxr+uTgLBJOmnktdzPRL
MLItvnoktMEjfP/dY5kjw2aGrGCP2IRoBXk2Juppiik6J7AMFtUrUOuAaWG961Zr
OyuOW1THytEuaYm7PKKQSwo2PJYDVo9+LM8b//a2LrhdhFYzkZd4+YunSHGSvWAs
5YQhbp/5mwhjm3L+FAFFA/RP5CpIy0VUJqQs5pEXWuSqWrTc0v4=
-----END CERTIFICATE-----
31 changes: 31 additions & 0 deletions spot_wrapper/testing/credentials/ca.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFZzCCA0+gAwIBAgIUa6msg8Z7PTIIoDePCBJiePqrHFowDQYJKoZIhvcNAQEL
BQAwQjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24x
FTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAgFw0yNDA0MTIxNzMwNDNaGA8zMDIzMDgx
NDE3MzA0M1owQjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1BMQ8wDQYDVQQHDAZC
b3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBALEaiRb45Y1WCWA/J0oU84aZ4rXanPceyFldgGrA6GGoNVLl
MNKyg2V5nElLgV+DsAigC0czNOoTyRlocZ8ekW1cPgTmsm42g+AReU2qPEzKYHPz
6K0XbZ63vHUC0ox1sPqQIRPVamnAKQkU8TsCLwhuulqQLGKKqDooTGco9RQcY7UA
Wzmwvo5rvxTmkBQxcmdw+qgDrbxXISmocIh4J/zl22LZawS+nHvW/HTl2tg9hYAY
tDtpjW6U9HDjOPdkizDoZVbsJMKY6vIjujb7yaKh2ZuW2T//NH+2Vzxk4RKOcyox
yCnZFxhIBPWHcLHD92ta/ZN7i7AsF7NrE3BVBXXlbe1hYpJTqAi8IMyLYdIeEeaD
MGUwZa/vI5XVRLPl5UU6ECo8/9hj4/JDdJWC/EpU+d5C44DNljXpyFH6QRSf9gRj
XXx4qWaWTbIeqlQNj1eGJGa8MM03WmjcouiHTOh8asK17zwyYYnrtGMX2CnAtiw5
sxgaC2QcINh7ZgAClWEQhpi/fXR96JsgJF+/jCLosA+0PMPCJeKtkTxo441XTWNT
ilKn1sJ7WIEZ9If0GdhuiW6to4vWoqQNkCSf1Mg/VjMcsJgui2l7ABJTBjoRHS/Z
rMBZIApQkgXnaaMXgiXoMItAUJZ/fOWkOK+y7b1KmwSzClpJa/PMjgm1L2XfAgMB
AAGjUzBRMB0GA1UdDgQWBBTF424r/sU/9OqWx1FyXtiYAqr7jjAfBgNVHSMEGDAW
gBTF424r/sU/9OqWx1FyXtiYAqr7jjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4ICAQA6xRBBSWxWnvxTtaCGgyfR/SVkBAFu+SLw8xTI1TiZb8Tzh0Gc
ciS/vfo20eJ1+C5UEVmlMb/oxEewROkY7+RKCTlI7Vl0KD7Gz9HUpPz8o2POs43B
5AvXLlqDknD+UP6QG+AR9UEdjNs8UAiv62gwghQMwafVwpltNIMk0cDILxBHh3K2
dGONtuWrnwU0y1i+sAdIUKv+zCV/Mkyxkm31PzKnYQMFEggUxP4Pvu95KZily1O4
WfUZzwZB6hN6Rp/mrxPgmDuGOqSLbJBSjDF8DN47kwFU1nlS8wOH5nn+3EbWjPzH
4gB3IpETLLrQYqXawjC9x0KknDfIxKDhHMsRldQEUYBMFPmTXnM+mnWmXrvMk+/Q
fxJo1fvDIv/3nuv939yEkWkM4m+OLQxhLnuu3NsVktau+7ivK8XN01Ytxq9fz3C9
k1fOlQcwC7dBNXurBS2yd/PnR7l/oh/B93sQFuaZcIkJElSYVRbEEaueOlLpL16d
oU3t/Rr5sNksA/EoQ/M6RpdesAulZsZ8CuHM6lPwlA9h+9jiNtyd84R7gWeh3JIU
mhXsBqtSYWhUVB9Csa0+MBjrq8wLNcJcwxhedYS/9FPvmPu02APhTWja89+cPeGD
Pi8O9F6nFbPhkYpczp+hYSV3dsoUw8ld4SOa7asfkpHlKSCSmZ8Eah1K3Q==
-----END CERTIFICATE-----
28 changes: 28 additions & 0 deletions spot_wrapper/testing/credentials/id.spot.robot.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIE0DCCArgCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg
Fw0yNDA0MTIxODEzMjVaGA8zMDIzMDgxNDE4MTMyNVowGDEWMBQGA1UEAwwNaWQu
c3BvdC5yb2JvdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANp8ON13
J+3Pmm8aqmE2mFFIhfr+NN4f6XmwobJWELp36TzUaREqm1Dvtc20Gi9WDpK4Tg6L
WmgfCQZ++c4MzoIRdvcwgEIoGmrxQ2X58/kNGczUCSwpWNHKrSQ4Qu02VbJ9G4Ke
EdhVPlehUv31atvpF9Rt0xLHgi7tT4DQZSxq068xcArcgi2J8c2bU9h2CBk/9nAy
ubpeTLscY3uT3B/cUSYASk8lyzC8D/7HQYZCcARI1uxoTbqfkyBVKb17jmX3PlHg
u0DJWcBie4ruXb/n5uvAF3vR2irZx2ajJTFfZ4r73WmiNHaFU97dq+ChPTJhO9x3
7KSRolYHm0ogeBNI1py03cOxkP/93Szqk4/TKJE9JuqYLoawacOGOotGxr8PoPt9
zvViaT6m/lbIcoHpOX6raPx5iQtgTyEJzRjQXz0+H/IYbbYLNbi/y1Csb5AuL/TU
AmPMbJth7JXk6m5GwwpSWpM60SyxHzaAIxiTVBujwMYY9vO10v0ZpWIuvKSbJfb6
P86flFLSbiFJIjEIa5WO9hnPagi9ltp1GmesgoK3BguSRZeYZmLlhOUoO0eqXK2L
vcXI4bS/5/qYK53ZbEudxn7gNvt1YaQ7jP6mq0F+C//CZvT/NjqgSltfh1ByEGj+
Lxm3gumPCLV+r3K8TfYEALgS4TgbIKNTxSgDAgMBAAEwDQYJKoZIhvcNAQELBQAD
ggIBAA/EZkC3jGHn0KqScCcZ/yFX87eGiGvCPfUyXxOYyxMfxqZGrAr6VgxAguWs
vnIV8sQU6lpTPGaakM2Z/8AnzXeCFoYD7Gh8nsiZiKZnocrG92q7TuFgWigSUv9h
QhCX5DGWC1vpe9Y9CLnrtd/78g2YBCZ6I1uZv/D1uRjML/LZsJ+/KQia6v7w8L9P
3Sv4A7rT6oarnhQGPgB2CtxWL0wQI3LBCy0E5jE2/XJAmOUd6gr8g6Qs49tTQmU1
T+vZyyDGLhBrok3NTNddC9Z118E9LCZ+UaE6Q5Qx7IvHhjvODfp9hzGkuMfjmiDA
EGab5qzcoFhveu1MpbysbajURrxR0XgHPVZeCf94s8OYRwE1v5Ky2G20N10npdJM
pX16L8eg/DfY9aWdoSDPt/A9/5d0Oxh25h4kZGMPuaKce66hNQanMbKH4fr2h9OR
POlf5KwaMYtY6V2YcDHeBBHsG342tngXa9JEvaotww824d6FcYgfxOks08x6V5UU
mOwG4RJCwO/zaQ2bRrYE4IdvB5z6ZaJ6CZmvc4nFXgPzzhBq0dTPZdZZMyWg/haG
XDV+oBC2iePiWma0PnW0DkyvD1WhcWbeD3CWEMuf+kPkqpZVYCy0UqVxBFtBLUn7
z7m4oqur/7YXC+kRwxdF0KoMdTzfaWNyP8ol7CR3BcQUfXTj
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIE4jCCAsoCAQEwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAk1BMQ8wDQYDVQQHDAZCb3N0b24xFTATBgNVBAoMDHNwb3Rfd3JhcHBlcjAg
Fw0yNDA0MTIxODEzNDJaGA8zMDIzMDgxNDE4MTM0MlowKjEoMCYGA1UEAwwfcGF5
bG9hZC1yZWdpc3RyYXRpb24uc3BvdC5yb2JvdDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBANp8ON13J+3Pmm8aqmE2mFFIhfr+NN4f6XmwobJWELp36TzU
aREqm1Dvtc20Gi9WDpK4Tg6LWmgfCQZ++c4MzoIRdvcwgEIoGmrxQ2X58/kNGczU
CSwpWNHKrSQ4Qu02VbJ9G4KeEdhVPlehUv31atvpF9Rt0xLHgi7tT4DQZSxq068x
cArcgi2J8c2bU9h2CBk/9nAyubpeTLscY3uT3B/cUSYASk8lyzC8D/7HQYZCcARI
1uxoTbqfkyBVKb17jmX3PlHgu0DJWcBie4ruXb/n5uvAF3vR2irZx2ajJTFfZ4r7
3WmiNHaFU97dq+ChPTJhO9x37KSRolYHm0ogeBNI1py03cOxkP/93Szqk4/TKJE9
JuqYLoawacOGOotGxr8PoPt9zvViaT6m/lbIcoHpOX6raPx5iQtgTyEJzRjQXz0+
H/IYbbYLNbi/y1Csb5AuL/TUAmPMbJth7JXk6m5GwwpSWpM60SyxHzaAIxiTVBuj
wMYY9vO10v0ZpWIuvKSbJfb6P86flFLSbiFJIjEIa5WO9hnPagi9ltp1GmesgoK3
BguSRZeYZmLlhOUoO0eqXK2LvcXI4bS/5/qYK53ZbEudxn7gNvt1YaQ7jP6mq0F+
C//CZvT/NjqgSltfh1ByEGj+Lxm3gumPCLV+r3K8TfYEALgS4TgbIKNTxSgDAgMB
AAEwDQYJKoZIhvcNAQELBQADggIBAAQ1Fk6Gh1OoSRi7GUHTviJ9r2FcdjkgyMYp
E1JFiKYkkpwXAqhLeE0CEmTvdTLqo9SAfY5YkA6pJpr3LZ9Ns3Kcd35BUlHA5QF9
EgNzJkjvKDCnxWlVhoVRwK9Mff0Twe3ANtUI9WHfvqNgLAFhX1RjipcDBsmyJRk6
TDeCXbU5cFf/c+wqCeRi5Abu8FNkqEtr3YypL5CjZX/UtCXNVkifjZsL5ayAaQ8L
bea05Y7gPPgWQVNNAPAQDrsAQeLGPIg5hSD+SjEGsq3+GaP0cVG/GBiWR4c4rfX4
+OoO+8krm6YTovITuIzqjVuZ/mUKyqutyexx5MB3Rjy9cgW7TGcWvadyVCveRaZB
QjkfYqLg2HVVAi3dwwOacAAmd5aKDplyx9OraIBj79PBTCeD3uJ9ZiG7aukHRe2l
bm6fyS1Y9rQ5dwCyoRpJSfci7qMq8YUQxeLwO3WAZkBKeDd/qzpqEdtsD9FQB798
1y+ZqNeIlppAbpMJR83pbAiewihsD+1+nJ/paceCGqrqI6hSDPYlAUWelHvwmb5k
gSss4F2F+N2MNu/L1B0a6v1YI0478IRHF/vvZCbDXUMefPqCmIvW+tsMv58jApop
lgYviX3aJKO+NasNF/Lp5XUQMVOvF6ajLRaJPkWV6plenWr1DyhoP4kOZXY7Gpd9
yJ3X4n2r
-----END CERTIFICATE-----
52 changes: 52 additions & 0 deletions spot_wrapper/testing/credentials/robot.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
960g90lE5bLBOFWNQM4UxWWf9RqH9g==
-----END PRIVATE KEY-----
42 changes: 22 additions & 20 deletions spot_wrapper/testing/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
import concurrent.futures
import dataclasses
import functools
import inspect
import pathlib
import typing

import grpc
import pytest

from spot_wrapper.testing.credentials import (
DEFAULT_TESTING_CERTIFICATES,
SpotSSLCertificates,
)
from spot_wrapper.testing.mocks import BaseMockSpot


Expand All @@ -25,6 +29,7 @@ class SpotFixture:

address: str
port: int
certificate_path: pathlib.Path
api: BaseMockSpot


Expand All @@ -33,6 +38,7 @@ def fixture(
*,
address: str = "127.0.0.1",
max_workers: int = 10,
certificates: SpotSSLCertificates = DEFAULT_TESTING_CERTIFICATES,
**kwargs: typing.Any,
) -> typing.Callable:
"""
Expand All @@ -54,35 +60,31 @@ def fixture(
"""

def decorator(cls: typing.Type[BaseMockSpot]) -> typing.Callable:
def fixturefunc(monkeypatch, **kwargs) -> typing.Iterator[SpotFixture]:
def fixturefunc(**kwargs) -> typing.Iterator[SpotFixture]:
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as thread_pool:
server = grpc.server(thread_pool)
port = server.add_insecure_port(f"{address}:0")
robot_certificate_key = certificates.robot_certificate_key_path.read_bytes()
server_credentials = grpc.ssl_server_credentials(
[
(robot_certificate_key, certificate_path.read_bytes())
for certificate_path in certificates.robot_certificate_paths
]
)
port = server.add_secure_port(f"{address}:0", server_credentials)
with cls(**kwargs) as mock:
mock.add_to(server)
server.start()
try:
with monkeypatch.context() as m:

def mock_secure_channel(target, _, *args, **kwargs):
return grpc.insecure_channel(target, *args, **kwargs)

m.setattr(grpc, "secure_channel", mock_secure_channel)
yield SpotFixture(address=address, port=port, api=mock)
yield SpotFixture(
address=address,
port=port,
api=mock,
certificate_path=certificates.root_certificate_path,
)
finally:
server.stop(grace=None)

functools.update_wrapper(fixturefunc, cls)
sig = inspect.signature(fixturefunc)
if "monkeypatch" not in sig.parameters:
sig = sig.replace(
parameters=(
inspect.Parameter("monkeypatch", inspect.Parameter.POSITIONAL_OR_KEYWORD),
*sig.parameters.values(),
)
)
fixturefunc.__signature__ = sig # noqa

return pytest.fixture(fixturefunc, **kwargs)

if cls is None:
Expand Down
1 change: 1 addition & 0 deletions spot_wrapper/tests/test_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def simple_spot_wrapper(simple_spot: SpotFixture) -> Iterator[SpotWrapper]:
hostname=simple_spot.address,
port=simple_spot.port,
robot_name=simple_spot.api.name,
cert_resource_glob=str(simple_spot.certificate_path),
logger=logging.getLogger("spot"),
)
ok, message = spot_wrapper.claim()
Expand Down
3 changes: 2 additions & 1 deletion spot_wrapper/wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ def __init__(
continually_try_stand: bool = True,
rgb_cameras: bool = True,
payload_credentials_file: str = None,
cert_resource_glob: typing.Optional[str] = None,
) -> None:
"""
Args:
Expand Down Expand Up @@ -391,7 +392,7 @@ def __init__(
self._command_data = RobotCommandData()

try:
self._sdk = create_standard_sdk(SPOT_CLIENT_NAME)
self._sdk = create_standard_sdk(SPOT_CLIENT_NAME, cert_resource_glob=cert_resource_glob)
except Exception as e:
self._logger.error("Error creating SDK object: %s", e)
self._valid = False
Expand Down