Skip to content

Commit

Permalink
tests/cancel_utterance (#486)
Browse files Browse the repository at this point in the history
* tests/cancel_utterance

add a test for utterance cancelation plugin https://github.com/OpenVoiceOS/ovos-utterance-plugin-cancel/

* requirements.txt ...

* test transformers

* test transformers

* test transformers

* test transformers

* just skip them 🤷
  • Loading branch information
JarbasAl authored May 28, 2024
1 parent b880ac2 commit 0e8dd96
Show file tree
Hide file tree
Showing 8 changed files with 218 additions and 3 deletions.
1 change: 1 addition & 0 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ jobs:
pip install ./test/end2end/skill-old-stop
pip install ./test/end2end/skill-fake-fm
pip install ./test/end2end/skill-fake-fm-legacy
pip install ./test/end2end/metadata-test-plugin
- name: Install core repo
run: |
pip install -e .[mycroft,deprecated]
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ jobs:
pip install ./test/end2end/skill-old-stop
pip install ./test/end2end/skill-fake-fm
pip install ./test/end2end/skill-fake-fm-legacy
pip install ./test/end2end/metadata-test-plugin
- name: Install core repo
run: |
pip install -e .[mycroft,deprecated]
Expand Down
12 changes: 10 additions & 2 deletions ovos_core/transformers.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@ def __init__(self, bus, config=None):
self.config = self.config_core.get("utterance_transformers") or {}
self.load_plugins()

@staticmethod
def find_plugins():
return find_utterance_transformer_plugins().items()

def load_plugins(self):
for plug_name, plug in find_utterance_transformer_plugins().items():
for plug_name, plug in self.find_plugins():
if plug_name in self.config:
# if disabled skip it
if not self.config[plug_name].get("active", True):
Expand Down Expand Up @@ -74,8 +78,12 @@ def __init__(self, bus, config=None):
self.config = self.config_core.get("metadata_transformers") or {}
self.load_plugins()

@staticmethod
def find_plugins():
return find_metadata_transformer_plugins().items()

def load_plugins(self):
for plug_name, plug in find_metadata_transformer_plugins().items():
for plug_name, plug in self.find_plugins():
if plug_name in self.config:
# if disabled skip it
if not self.config[plug_name].get("active", True):
Expand Down
4 changes: 3 additions & 1 deletion requirements/tests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ ovos-messagebus~=0.0

# Support OCP tests
ovos_bus_client>=0.0.9a15
ovos-utils>=0.1.0a16
ovos-utils>=0.1.0a16

ovos-utterance-plugin-cancel>=0.0.1a3
10 changes: 10 additions & 0 deletions test/end2end/metadata-test-plugin/metadata_test/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from ovos_plugin_manager.templates.transformers import MetadataTransformer


class MetadataPlugin(MetadataTransformer):

def __init__(self, name="ovos-metadata-test-plugin", priority=15):
super().__init__(name, priority)

def transform(self, context: dict | None = None) -> dict:
return {"metadata": "test"}
28 changes: 28 additions & 0 deletions test/end2end/metadata-test-plugin/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env python3

from setuptools import setup

META_ENTRY_POINT = 'ovos-metadata-test-plugin=metadata_test:MetadataPlugin'

setup(
name="ovos-metadata-test-plugin",
description='OpenVoiceOS metadata test Plugin',
version="0.0.1",
author_email='[email protected]',
license='apache-2.0',
packages=["metadata_test"],
include_package_data=True,
zip_safe=True,
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'Topic :: Text Processing :: Linguistic',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
],
entry_points={
'neon.plugin.metadata': META_ENTRY_POINT
}
)
4 changes: 4 additions & 0 deletions test/end2end/minicroft.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ def __init__(self, skill_ids, ocp=False, *args, **kwargs):
self.intent_service = self._register_intent_services(ocp=ocp)
self.scheduler = EventScheduler(bus, schedule_file="/tmp/schetest.json")

def load_metadata_transformers(self, cfg):
self.intent_service.metadata_plugins.config = cfg
self.intent_service.metadata_plugins.load_plugins()

def _register_intent_services(self, ocp=False):
"""Start up the all intent services and connect them as needed.
Expand Down
161 changes: 161 additions & 0 deletions test/end2end/session/test_transformers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
import time
from time import sleep
from unittest import TestCase, skip

from ovos_bus_client.message import Message
from ovos_bus_client.session import SessionManager, Session
from ovos_core.transformers import UtteranceTransformersService, MetadataTransformersService
from ..minicroft import get_minicroft


class TestTransformerPlugins(TestCase):

def setUp(self):
self.skill_id = "skill-ovos-hello-world.openvoiceos"
self.core = get_minicroft(self.skill_id)

def tearDown(self) -> None:
self.core.stop()

@skip("TODO - failing in github actions, not finding metadata test plugin? passes locally")
def test_transformer_plugins(self):
# test plugins found
self.assertIn('ovos-utterance-plugin-cancel', [k[0] for k in UtteranceTransformersService.find_plugins()])
self.assertIn('ovos-metadata-test-plugin', [k[0] for k in MetadataTransformersService.find_plugins()])

def test_cancel(self):

self.assertIn('ovos-utterance-plugin-cancel', self.core.intent_service.utterance_plugins.loaded_plugins)

SessionManager.sessions = {}
SessionManager.default_session = SessionManager.sessions["default"] = Session("default")
SessionManager.default_session.lang = "en-us"
SessionManager.default_session.active_skills = [(self.skill_id, time.time())]
SessionManager.default_session.pipeline = [
"stop_high",
"converse",
"padatious_high",
"adapt_high",
"fallback_high",
"stop_medium",
"adapt_medium",
"padatious_medium",
"adapt_low",
"common_qa",
"fallback_medium",
"fallback_low"
]
messages = []

def new_msg(msg):
nonlocal messages
m = Message.deserialize(msg)
if m.msg_type in ["ovos.skills.settings_changed"]:
return # skip these, only happen in 1st run
messages.append(m)
print(len(messages), msg)

def wait_for_n_messages(n):
nonlocal messages
t = time.time()
while len(messages) < n:
sleep(0.1)
if time.time() - t > 10:
raise RuntimeError("did not get the number of expected messages under 10 seconds")

self.core.bus.on("message", new_msg)

utt = Message("recognizer_loop:utterance",
{"utterances": ["hello world , actually, cancel order"]},
{"session": SessionManager.default_session.serialize()})
self.core.bus.emit(utt)

# confirm all expected messages are sent
expected_messages = [
"recognizer_loop:utterance",
"mycroft.audio.play_sound",
"ovos.utterance.cancelled",
"ovos.utterance.handled" # handle_utterance returned (intent service)
]
wait_for_n_messages(len(expected_messages))

self.assertEqual(len(expected_messages), len(messages))

for idx, m in enumerate(messages):
self.assertEqual(m.msg_type, expected_messages[idx])

# verify the transformer metadata was injected
for m in messages[1:]:
self.assertEqual(m.context["session"]["session_id"], "default") # session
self.assertEqual(m.context["cancel_word"], "cancel order") # cancel plugin

# verify sound
self.assertEqual(messages[1].data["uri"], "snd/cancel.mp3")

@skip("TODO - failing in github actions, not finding metadata test plugin? passes locally")
def test_meta(self):
self.assertNotIn('ovos-metadata-test-plugin', self.core.intent_service.metadata_plugins.loaded_plugins)
self.core.load_metadata_transformers({"ovos-metadata-test-plugin": {}})
self.assertIn('ovos-metadata-test-plugin', self.core.intent_service.metadata_plugins.loaded_plugins)

SessionManager.sessions = {}
SessionManager.default_session = SessionManager.sessions["default"] = Session("default")
SessionManager.default_session.lang = "en-us"
SessionManager.default_session.active_skills = [(self.skill_id, time.time())]
SessionManager.default_session.pipeline = [
"stop_high",
"converse",
"padatious_high",
"adapt_high",
"fallback_high",
"stop_medium",
"adapt_medium",
"padatious_medium",
"adapt_low",
"common_qa",
"fallback_medium",
"fallback_low"
]
messages = []

def new_msg(msg):
nonlocal messages
m = Message.deserialize(msg)
if m.msg_type in ["ovos.skills.settings_changed"]:
return # skip these, only happen in 1st run
messages.append(m)
print(len(messages), msg)

def wait_for_n_messages(n):
nonlocal messages
t = time.time()
while len(messages) < n:
sleep(0.1)
if time.time() - t > 10:
raise RuntimeError("did not get the number of expected messages under 10 seconds")

self.core.bus.on("message", new_msg)

utt = Message("recognizer_loop:utterance",
{"utterances": ["hello world , actually, cancel order"]},
{"session": SessionManager.default_session.serialize()})
self.core.bus.emit(utt)

# confirm all expected messages are sent
expected_messages = [
"recognizer_loop:utterance",
"mycroft.audio.play_sound",
"ovos.utterance.cancelled",
"ovos.utterance.handled" # handle_utterance returned (intent service)
]
wait_for_n_messages(len(expected_messages))

self.assertEqual(len(expected_messages), len(messages))

for idx, m in enumerate(messages):
self.assertEqual(m.msg_type, expected_messages[idx])

# verify the transformer metadata was injected
for m in messages[1:]:
self.assertEqual(m.context["session"]["session_id"], "default") # session
self.assertEqual(m.context["metadata"], "test") # metadata plugin

0 comments on commit 0e8dd96

Please sign in to comment.