From a4acf0a2c260fbb92267a955de073e02d146982c Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 20:55:15 +0900 Subject: [PATCH 1/9] =?UTF-8?q?pytest=20=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pipfile | 1 + Pipfile.lock | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index c398b0d5..968fa0b2 100644 --- a/Pipfile +++ b/Pipfile @@ -6,6 +6,7 @@ name = "pypi" [packages] [dev-packages] +pytest = "*" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index eb6410cb..58adbb6c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "fedbd2ab7afd84cf16f128af0619749267b62277b4cb6989ef16d4bef6e4eef2" + "sha256": "f18df9d00946652387478f07706c1660c48e11c06556d86f7ff0fdd35b2e21b6" }, "pipfile-spec": 6, "requires": { @@ -16,5 +16,54 @@ ] }, "default": {}, - "develop": {} + "develop": { + "exceptiongroup": { + "hashes": [ + "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", + "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + ], + "markers": "python_version < '3.11'", + "version": "==1.1.1" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "pytest": { + "hashes": [ + "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362", + "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3" + ], + "index": "pypi", + "version": "==7.3.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } } From 98b50e5ee06ee68a09b2269343da26c141894175 Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 21:20:51 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=E5=9E=8B=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d9a569fc..ea258285 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -125,5 +125,6 @@ "__memory": "cpp" }, "C_Cpp.errorSquiggles": "disabled", - "editor.tabSize": 2 // nanobind 周りでエラーが消えないので全部消す + "editor.tabSize": 2, + "python.analysis.typeCheckingMode": "basic" // nanobind 周りでエラーが消えないので全部消す } From e9a4dd2a13524ddbd57b286bf5ac38f474a0697b Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 21:21:03 +0900 Subject: [PATCH 3/9] =?UTF-8?q?tests/=20=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 + Pipfile | 3 + Pipfile.lock | 149 +++++++++++++++++++++++++++++++++++- tests/test_sendonly.py | 58 ++++++++++++++ 4 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 tests/test_sendonly.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 390fe4a7..9a8e261f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,8 @@ name: build on: workflow_dispatch: push: + branches-ignore: + - "feature/e2e-test" paths-ignore: - "doc/**" - "**.md" diff --git a/Pipfile b/Pipfile index 968fa0b2..183dbf73 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,9 @@ name = "pypi" [dev-packages] pytest = "*" +opencv-python = "*" +opencv-python-headless = "*" +sounddevice = "*" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 58adbb6c..2048798d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f18df9d00946652387478f07706c1660c48e11c06556d86f7ff0fdd35b2e21b6" + "sha256": "bed4984a16bb234dcb291529118fc795d04f74e916a7047ebc719f655a1a036e" }, "pipfile-spec": 6, "requires": { @@ -17,6 +17,75 @@ }, "default": {}, "develop": { + "cffi": { + "hashes": [ + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + ], + "version": "==1.15.1" + }, "exceptiongroup": { "hashes": [ "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", @@ -33,6 +102,66 @@ "markers": "python_version >= '3.7'", "version": "==2.0.0" }, + "numpy": { + "hashes": [ + "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187", + "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812", + "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7", + "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4", + "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6", + "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0", + "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4", + "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570", + "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4", + "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f", + "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80", + "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289", + "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385", + "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078", + "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c", + "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463", + "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3", + "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950", + "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155", + "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7", + "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c", + "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096", + "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17", + "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf", + "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4", + "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02", + "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c", + "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b" + ], + "markers": "python_version >= '3.10'", + "version": "==1.24.3" + }, + "opencv-python": { + "hashes": [ + "sha256:3424794a711f33284581f3c1e4b071cfc827d02b99d6fd9a35391f517c453306", + "sha256:7a297e7651e22eb17c265ddbbc80e2ba2a8ff4f4a1696a67c45e5f5798245842", + "sha256:812af57553ec1c6709060c63f6b7e9ad07ddc0f592f3ccc6d00c71e0fe0e6376", + "sha256:cd08343654c6b88c5a8c25bf425f8025aed2e3189b4d7306b5861d32affaf737", + "sha256:d4f8880440c433a0025d78804dda6901d1e8e541a561dda66892d90290aef881", + "sha256:ebfc0a3a2f57716e709028b992e4de7fd8752105d7a768531c4f434043c6f9ff", + "sha256:eda115797b114fc16ca6f182b91c5d984f0015c19bec3145e55d33d708e9bae1" + ], + "index": "pypi", + "version": "==4.7.0.72" + }, + "opencv-python-headless": { + "hashes": [ + "sha256:18dac3147863d2f4beef6b06b784ee115799a7842e2883adc4ae750c432613f9", + "sha256:2f8b60bddd325411cf4664e4dbea729ce20f0c2ffeaedc5c6724b544fdf36e8a", + "sha256:388015ee96816b71e529fed6153aeb68420b69a80efad7aad5445fd7cd7a154c", + "sha256:6e13954f705e640e52962dfb252ee1f0a0af7b33cdbe8dd73f27e7e31172b7a2", + "sha256:eea59caa92b28b197f9d2a2dd8275ca3869718b2a857c8e53203de6ef3f9f4db", + "sha256:f448aea686069474e701223a2ed192df95f501a092b5e06e39171b4927564692", + "sha256:f7f421a2099acbfb69db5e571abaf69a90f43846c3832452c19611efc2c6c926" + ], + "index": "pypi", + "version": "==4.7.0.72" + }, "packaging": { "hashes": [ "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", @@ -49,6 +178,13 @@ "markers": "python_version >= '3.6'", "version": "==1.0.0" }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" + }, "pytest": { "hashes": [ "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362", @@ -57,6 +193,17 @@ "index": "pypi", "version": "==7.3.1" }, + "sounddevice": { + "hashes": [ + "sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9", + "sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20", + "sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c", + "sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8", + "sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b" + ], + "index": "pypi", + "version": "==0.4.6" + }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", diff --git a/tests/test_sendonly.py b/tests/test_sendonly.py new file mode 100644 index 00000000..519fe43f --- /dev/null +++ b/tests/test_sendonly.py @@ -0,0 +1,58 @@ +import os +import signal + +import cv2 +import sounddevice + +from sora_sdk import Sora + +use_hardware_encoder = False +channels = 1 +samplerate = 16000 + + +def test_sendonly(): + # ここで ffmpeg で仮想カメラを作成する + + sora = Sora(use_hardware_encoder) + audio_source = sora.create_audio_source(channels, samplerate) + video_source = sora.create_video_source() + + signaling_url = os.environ.get('SIGNALING_URL') + access_token = os.environ.get('ACCESS_TOKEN') + + connection = sora.create_connection( + signaling_url=signaling_url, + role="sendonly", + channel_id="channel_id", + client_id="sendonly", + metadata={'access_token': access_token}, + audio_source=audio_source, + video_source=video_source + ) + video_capture = cv2.VideoCapture(0) + running = True + + signal.signal(signal.SIGINT, handler) + + with sounddevice.InputStream(samplerate=samplerate, channels=channels, dtype='int16', callback=callback): + connection.connect() + + while running: + success, frame = video_capture.read() + if not success: + continue + video_source.on_captured(frame) + + connection.disconnect() + video_capture.release() + + +def handler(signum, frame): + global running + running = False + + +def callback(indata, frames, time, status): + global audio_source + audio_source.on_data(indata) From cba99e809263e86d29672b816f78dc6f6b21f865 Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 21:33:05 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=80=A4=E3=82=92=E5=8F=96=E5=BE=97=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_sendonly.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_sendonly.py b/tests/test_sendonly.py index 519fe43f..71bbeb38 100644 --- a/tests/test_sendonly.py +++ b/tests/test_sendonly.py @@ -18,13 +18,14 @@ def test_sendonly(): audio_source = sora.create_audio_source(channels, samplerate) video_source = sora.create_video_source() - signaling_url = os.environ.get('SIGNALING_URL') - access_token = os.environ.get('ACCESS_TOKEN') + signaling_url = os.environ.get('TEST_SIGNALING_URL') + access_token = os.environ.get('TEST_ACCESS_TOKEN') + channel_id_prefix = os.environ.get('TEST_CHANNEL_ID_PREFIX') connection = sora.create_connection( signaling_url=signaling_url, role="sendonly", - channel_id="channel_id", + channel_id=f'{channel_id_prefix}_sendonly', client_id="sendonly", metadata={'access_token': access_token}, audio_source=audio_source, From 6158ac859ef7cdd4b0a645d415321d15266d8bdf Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 22:13:03 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_sendonly.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tests/test_sendonly.py b/tests/test_sendonly.py index 71bbeb38..83107b97 100644 --- a/tests/test_sendonly.py +++ b/tests/test_sendonly.py @@ -4,6 +4,7 @@ import cv2 import sounddevice +# Sora が見たらないといわれてる from sora_sdk import Sora use_hardware_encoder = False @@ -12,6 +13,15 @@ def test_sendonly(): + def handler(signum, frame): + global running + running = False + + def callback(indata, frames, time, status): + global audio_source + # audio_sourceが見当たらないといわれる + audio_source.on_data(indata) + # ここで ffmpeg で仮想カメラを作成する sora = Sora(use_hardware_encoder) @@ -37,6 +47,8 @@ def test_sendonly(): signal.signal(signal.SIGINT, handler) with sounddevice.InputStream(samplerate=samplerate, channels=channels, dtype='int16', callback=callback): + # ここがそもそも非同期なのがわかりやすくあってほしいかも + # await とか付いてると嬉しそう connection.connect() while running: @@ -45,15 +57,8 @@ def test_sendonly(): continue video_source.on_captured(frame) + # キーボードで抜ける仕組み + # expect: KeyboardInterrupt + connection.disconnect() video_capture.release() - - -def handler(signum, frame): - global running - running = False - - -def callback(indata, frames, time, status): - global audio_source - audio_source.on_data(indata) From 1bf6400a6310a5d7dfb44a45f8871855340d4a22 Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 24 Apr 2023 23:07:06 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E3=81=8B=E3=81=A4=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_sendonly.py | 92 ++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/tests/test_sendonly.py b/tests/test_sendonly.py index 83107b97..b653daf1 100644 --- a/tests/test_sendonly.py +++ b/tests/test_sendonly.py @@ -1,64 +1,68 @@ import os import signal +import threading +import time import cv2 +import pytest import sounddevice -# Sora が見たらないといわれてる from sora_sdk import Sora -use_hardware_encoder = False -channels = 1 -samplerate = 16000 +class Sendonly: + def __init__(self): + self.use_hardware_encoder = False + self.channels = 1 + self.samplerate = 16000 + self.running = True -def test_sendonly(): - def handler(signum, frame): - global running - running = False + def handler(self, signum, frame): + self.running = False - def callback(indata, frames, time, status): - global audio_source - # audio_sourceが見当たらないといわれる - audio_source.on_data(indata) + def callback(self, indata, frames, time, status): + self.audio_source.on_data(indata) - # ここで ffmpeg で仮想カメラを作成する + def stop(self): + self.running = False - sora = Sora(use_hardware_encoder) - audio_source = sora.create_audio_source(channels, samplerate) - video_source = sora.create_video_source() + def run(self): + sora = Sora(self.use_hardware_encoder) + self.audio_source = sora.create_audio_source( + self.channels, self.samplerate) + video_source = sora.create_video_source() + connection = sora.create_connection( + signaling_url=os.environ.get("TEST_SIGNALING_URL"), + role="sendonly", + channel_id=os.environ.get("TEST_CHANNEL_ID_PREFIX"), + client_id="sendonly", + metadata={'access_token': os.environ.get("TEST_SECRET_KEY")}, + audio_source=self.audio_source, + video_source=video_source + ) - signaling_url = os.environ.get('TEST_SIGNALING_URL') - access_token = os.environ.get('TEST_ACCESS_TOKEN') - channel_id_prefix = os.environ.get('TEST_CHANNEL_ID_PREFIX') + video_capture = cv2.VideoCapture(0) - connection = sora.create_connection( - signaling_url=signaling_url, - role="sendonly", - channel_id=f'{channel_id_prefix}_sendonly', - client_id="sendonly", - metadata={'access_token': access_token}, - audio_source=audio_source, - video_source=video_source - ) - video_capture = cv2.VideoCapture(0) - running = True + signal.signal(signal.SIGINT, self.handler) - signal.signal(signal.SIGINT, handler) + with sounddevice.InputStream(samplerate=self.samplerate, channels=self.channels, dtype='int16', callback=self.callback): + connection.connect() - with sounddevice.InputStream(samplerate=samplerate, channels=channels, dtype='int16', callback=callback): - # ここがそもそも非同期なのがわかりやすくあってほしいかも - # await とか付いてると嬉しそう - connection.connect() + while self.running: + success, frame = video_capture.read() + if not success: + continue + video_source.on_captured(frame) - while running: - success, frame = video_capture.read() - if not success: - continue - video_source.on_captured(frame) + connection.disconnect() + video_capture.release() - # キーボードで抜ける仕組み - # expect: KeyboardInterrupt - connection.disconnect() - video_capture.release() +@pytest.mark.timeout(10) +def test_sendonly(): + sendonly = Sendonly() + sendonly_thread = threading.Thread(target=sendonly.run) + sendonly_thread.start() + time.sleep(5) + sendonly.stop() + sendonly_thread.join() From d020ea18a4b65f6ccc37c539afcb874d096a2b7d Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 19 Jun 2023 19:45:24 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E3=81=8A=E8=A9=A6=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 23 +++++++++++++ pyproject.toml | 1 + requirements-dev.lock | 4 +++ tests/test_recvonly.py | 25 ++++++++++++++ tests/test_sendonly.py | 68 -------------------------------------- 5 files changed, 53 insertions(+), 68 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 tests/test_recvonly.py delete mode 100644 tests/test_sendonly.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..19a4b8ee --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test + +on: + workflow_dispatch: + push: + paths-ignore: + - "doc/**" + - "**.md" + +jobs: + sora_python_sdk_e2e_test: + runs-on: ubuntu-latest + timeout-minutes: 10 + env: + TEST_SIGNALING_URL: ${{ secrets.TEST_SIGNALING_URL }} + TEST_SECRET_KEY: ${{ secrets.TEST_SECRET_KEY }} + TEST_CHANNEL_ID_PREFIX: ${{ secrets.TEST_CHANNEL_ID_PREFIX }} + steps: + - uses: sksat/setup-rye@v0.1.0 + - uses: actions/checkout@v3 + - run: rye sync + - run: rye run python run.py + - run: rye run pytest diff --git a/pyproject.toml b/pyproject.toml index d09bb92f..6358fb2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,4 +27,5 @@ dev-dependencies = [ "build~=0.10.0", "wheel~=0.40.0", "auditwheel~=5.4.0", + "pytest~=7.3.2", ] diff --git a/requirements-dev.lock b/requirements-dev.lock index 54db38cd..c711ac77 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -9,10 +9,14 @@ -e file:. auditwheel==5.4.0 build==0.10.0 +exceptiongroup==1.1.1 +iniconfig==2.0.0 nanobind==1.4.0 packaging==23.1 +pluggy==1.0.0 pyelftools==0.29 pyproject-hooks==1.0.0 +pytest==7.3.2 tomli==2.0.1 wheel==0.40.0 # The following packages are considered to be unsafe in a requirements file: diff --git a/tests/test_recvonly.py b/tests/test_recvonly.py new file mode 100644 index 00000000..a4b4a92d --- /dev/null +++ b/tests/test_recvonly.py @@ -0,0 +1,25 @@ +import os +import time + +from sora_sdk import Sora + + +def on_disconnect(error_code, message_abc: str): + print(f'on_disconnect: error_code: {error_code}, message: {message_abc}') + pass + + +# @pytest.mark.timeout(10) +def test_sendonly(): + sora = Sora() + conn = sora.create_connection( + signaling_url=os.environ.get("TEST_SIGNALING_URL"), + role="recvonly", + channel_id=os.environ.get("TEST_CHANNEL_ID_PREFIX") + "sora-python-sdk-test", + metadata={"access_token": os.environ.get("TEST_SECREt_KEY")} + ) + + conn.on_disconnect = on_disconnect + conn.connect() + time.sleep(3) + conn.disconnect() diff --git a/tests/test_sendonly.py b/tests/test_sendonly.py deleted file mode 100644 index b653daf1..00000000 --- a/tests/test_sendonly.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import signal -import threading -import time - -import cv2 -import pytest -import sounddevice - -from sora_sdk import Sora - - -class Sendonly: - def __init__(self): - self.use_hardware_encoder = False - self.channels = 1 - self.samplerate = 16000 - self.running = True - - def handler(self, signum, frame): - self.running = False - - def callback(self, indata, frames, time, status): - self.audio_source.on_data(indata) - - def stop(self): - self.running = False - - def run(self): - sora = Sora(self.use_hardware_encoder) - self.audio_source = sora.create_audio_source( - self.channels, self.samplerate) - video_source = sora.create_video_source() - connection = sora.create_connection( - signaling_url=os.environ.get("TEST_SIGNALING_URL"), - role="sendonly", - channel_id=os.environ.get("TEST_CHANNEL_ID_PREFIX"), - client_id="sendonly", - metadata={'access_token': os.environ.get("TEST_SECRET_KEY")}, - audio_source=self.audio_source, - video_source=video_source - ) - - video_capture = cv2.VideoCapture(0) - - signal.signal(signal.SIGINT, self.handler) - - with sounddevice.InputStream(samplerate=self.samplerate, channels=self.channels, dtype='int16', callback=self.callback): - connection.connect() - - while self.running: - success, frame = video_capture.read() - if not success: - continue - video_source.on_captured(frame) - - connection.disconnect() - video_capture.release() - - -@pytest.mark.timeout(10) -def test_sendonly(): - sendonly = Sendonly() - sendonly_thread = threading.Thread(target=sendonly.run) - sendonly_thread.start() - time.sleep(5) - sendonly.stop() - sendonly_thread.join() From 9fc7b09dba118466ceb5f572b61443e2b576a1dd Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 19 Jun 2023 19:48:46 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E8=B6=B3=E3=82=8A=E3=81=A6=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=83=91=E3=83=83=E3=82=B1=E3=83=BC=E3=82=B8=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 19a4b8ee..347079a6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,6 +18,9 @@ jobs: steps: - uses: sksat/setup-rye@v0.1.0 - uses: actions/checkout@v3 + - run: | + sudo apt-get update + sudo apt-get -y install libva-dev libdrm-dev - run: rye sync - run: rye run python run.py - run: rye run pytest From f68ada1562e4e1400ff8a0160e64d5101ec5c415 Mon Sep 17 00:00:00 2001 From: voluntas Date: Mon, 19 Jun 2023 19:59:05 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 2 +- tests/test_recvonly.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 347079a6..e200408a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,4 +23,4 @@ jobs: sudo apt-get -y install libva-dev libdrm-dev - run: rye sync - run: rye run python run.py - - run: rye run pytest + - run: rye run python -m pytest tests/test_recvonly.py diff --git a/tests/test_recvonly.py b/tests/test_recvonly.py index a4b4a92d..e001ffb6 100644 --- a/tests/test_recvonly.py +++ b/tests/test_recvonly.py @@ -6,17 +6,17 @@ def on_disconnect(error_code, message_abc: str): print(f'on_disconnect: error_code: {error_code}, message: {message_abc}') - pass # @pytest.mark.timeout(10) def test_sendonly(): sora = Sora() + conn = sora.create_connection( signaling_url=os.environ.get("TEST_SIGNALING_URL"), role="recvonly", channel_id=os.environ.get("TEST_CHANNEL_ID_PREFIX") + "sora-python-sdk-test", - metadata={"access_token": os.environ.get("TEST_SECREt_KEY")} + metadata={"access_token": os.environ.get("TEST_SECRET_KEY")} ) conn.on_disconnect = on_disconnect