From 15e6128c2a5805c2bd20eed3f34ddf6140f7b4cc Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Feb 2013 20:25:30 +0100 Subject: [PATCH 1/3] audio: Add dummy implementation of the audio actor --- mopidy/audio/__init__.py | 1 + mopidy/audio/dummy.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 mopidy/audio/dummy.py diff --git a/mopidy/audio/__init__.py b/mopidy/audio/__init__.py index 5adb333c..d38358c4 100644 --- a/mopidy/audio/__init__.py +++ b/mopidy/audio/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals # flake8: noqa from .actor import Audio +from .dummy import DummyAudio from .listener import AudioListener from .constants import PlaybackState from .utils import (calculate_duration, create_buffer, millisecond_to_clocktime, diff --git a/mopidy/audio/dummy.py b/mopidy/audio/dummy.py new file mode 100644 index 00000000..6628d069 --- /dev/null +++ b/mopidy/audio/dummy.py @@ -0,0 +1,62 @@ +from __future__ import unicode_literals + +import pykka + +from .constants import PlaybackState +from .listener import AudioListener + + +class DummyAudio(pykka.ThreadingActor): + def __init__(self): + super(DummyAudio, self).__init__() + self.state = PlaybackState.STOPPED + self._position = 0 + + def set_on_end_of_track(self, callback): + pass + + def set_uri(self, uri): + pass + + def set_appsrc(self, *args, **kwargs): + pass + + def emit_data(self, buffer_): + pass + + def emit_end_of_stream(self): + pass + + def get_position(self): + return self._position + + def set_position(self, position): + self._position = position + return True + + def start_playback(self): + return self._change_state(PlaybackState.PLAYING) + + def pause_playback(self): + return self._change_state(PlaybackState.PAUSED) + + def prepare_change(self): + return True + + def stop_playback(self): + return self._change_state(PlaybackState.STOPPED) + + def get_volume(self): + return 0 + + def set_volume(self, volume): + pass + + def set_metadata(self, track): + pass + + def _change_state(self, new_state): + old_state, self.state = self.state, new_state + AudioListener.send( + 'state_changed', old_state=old_state, new_state=new_state) + return True From 804a945e426bb4188027f1cbf86885262724ded7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 24 Feb 2013 21:10:20 +0100 Subject: [PATCH 2/3] tests: Use DummyAudio instead of mocks --- tests/backends/base/events.py | 2 +- tests/backends/base/playback.py | 7 ++++++- tests/backends/base/playlists.py | 3 +-- tests/backends/base/tracklist.py | 3 +-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/backends/base/events.py b/tests/backends/base/events.py index 2b6df347..1d31a721 100644 --- a/tests/backends/base/events.py +++ b/tests/backends/base/events.py @@ -10,7 +10,7 @@ from mopidy.backends import listener @mock.patch.object(listener.BackendListener, 'send') class BackendEventsTest(object): def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core.start(backends=[self.backend]).proxy() diff --git a/tests/backends/base/playback.py b/tests/backends/base/playback.py index 155fa661..d7979018 100644 --- a/tests/backends/base/playback.py +++ b/tests/backends/base/playback.py @@ -4,6 +4,8 @@ import mock import random import time +import pykka + from mopidy import audio, core from mopidy.core import PlaybackState from mopidy.models import Track @@ -18,7 +20,7 @@ class PlaybackControllerTest(object): tracks = [] def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(backends=[self.backend]) self.playback = self.core.playback @@ -29,6 +31,9 @@ class PlaybackControllerTest(object): assert self.tracks[0].length >= 2000, \ 'First song needs to be at least 2000 miliseconds' + def tearDown(self): + pykka.ActorRegistry.stop_all() + def test_initial_state_is_stopped(self): self.assertEqual(self.playback.state, PlaybackState.STOPPED) diff --git a/tests/backends/base/playlists.py b/tests/backends/base/playlists.py index c162e500..2184168f 100644 --- a/tests/backends/base/playlists.py +++ b/tests/backends/base/playlists.py @@ -4,7 +4,6 @@ import os import shutil import tempfile -import mock import pykka from mopidy import audio, core, settings @@ -19,7 +18,7 @@ class PlaylistsControllerTest(object): settings.LOCAL_TAG_CACHE_FILE = path_to_data_dir('library_tag_cache') settings.LOCAL_MUSIC_PATH = path_to_data_dir('') - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(backends=[self.backend]) diff --git a/tests/backends/base/tracklist.py b/tests/backends/base/tracklist.py index 39536edc..39fb020d 100644 --- a/tests/backends/base/tracklist.py +++ b/tests/backends/base/tracklist.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -import mock import random import pykka @@ -16,7 +15,7 @@ class TracklistControllerTest(object): tracks = [] def setUp(self): - self.audio = mock.Mock(spec=audio.Audio) + self.audio = audio.DummyAudio.start().proxy() self.backend = self.backend_class.start(audio=self.audio).proxy() self.core = core.Core(audio=self.audio, backends=[self.backend]) self.controller = self.core.tracklist From 7bad64fccc5de86b172ea0de9b10258907261452 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 25 Feb 2013 23:11:41 +0100 Subject: [PATCH 3/3] audio: Add docstring to DummyAudio --- mopidy/audio/dummy.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mopidy/audio/dummy.py b/mopidy/audio/dummy.py index 6628d069..ad14390f 100644 --- a/mopidy/audio/dummy.py +++ b/mopidy/audio/dummy.py @@ -1,3 +1,9 @@ +"""A dummy audio actor for use in tests. + +This class implements the audio API in the simplest way possible. It is used in +tests of the core and backends. +""" + from __future__ import unicode_literals import pykka