-
-
Notifications
You must be signed in to change notification settings - Fork 38k
Rework chromecast fix #16804
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
Rework chromecast fix #16804
Changes from 6 commits
00a3438
897934f
73b4e2e
abbe32c
c480850
0fc48ad
b0ef45e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -61,10 +61,6 @@ | |
| vol.All(cv.ensure_list, [cv.string]), | ||
| }) | ||
|
|
||
| CONNECTION_RETRY = 3 | ||
| CONNECTION_RETRY_WAIT = 2 | ||
| CONNECTION_TIMEOUT = 10 | ||
|
|
||
|
|
||
| @attr.s(slots=True, frozen=True) | ||
| class ChromecastInfo: | ||
|
|
@@ -216,9 +212,12 @@ async def async_setup_entry(hass, config_entry, async_add_entities): | |
| if not isinstance(config, list): | ||
| config = [config] | ||
|
|
||
| await asyncio.wait([ | ||
| # no pending task | ||
| done, _ = await asyncio.wait([ | ||
| _async_setup_platform(hass, cfg, async_add_entities, None) | ||
| for cfg in config]) | ||
| if any([task.exception() for task in done]): | ||
| raise PlatformNotReady | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What happens if the setup for two chromecast succeeded but failed for a third chromecast? Then I think this code would raise a If the devices have no UUID (don't know if this can be the case with config entries), this could end up creating new entities for the two connectable chromecasts every 10 seconds.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We will get the message such as |
||
|
|
||
|
|
||
| async def _async_setup_platform(hass: HomeAssistantType, config: ConfigType, | ||
|
|
@@ -250,8 +249,8 @@ def async_cast_discovered(discover: ChromecastInfo) -> None: | |
| if cast_device is not None: | ||
| async_add_entities([cast_device]) | ||
|
|
||
| async_dispatcher_connect(hass, SIGNAL_CAST_DISCOVERED, | ||
| async_cast_discovered) | ||
| remove_handler = async_dispatcher_connect( | ||
| hass, SIGNAL_CAST_DISCOVERED, async_cast_discovered) | ||
| # Re-play the callback for all past chromecasts, store the objects in | ||
| # a list to avoid concurrent modification resulting in exception. | ||
| for chromecast in list(hass.data[KNOWN_CHROMECAST_INFO_KEY]): | ||
|
|
@@ -265,8 +264,11 @@ def async_cast_discovered(discover: ChromecastInfo) -> None: | |
| info = await hass.async_add_job(_fill_out_missing_chromecast_info, | ||
| info) | ||
| if info.friendly_name is None: | ||
| # HTTP dial failed, so we won't be able to connect. | ||
| _LOGGER.debug("Cannot retrieve detail information for chromecast" | ||
| " %s, the device may not be online", info) | ||
| remove_handler() | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah yes, removing the handler is a good idea here 👍 |
||
| raise PlatformNotReady | ||
|
|
||
| hass.async_add_job(_discover_chromecast, hass, info) | ||
|
|
||
|
|
||
|
|
@@ -379,7 +381,7 @@ async def async_set_cast_info(self, cast_info): | |
| pychromecast._get_chromecast_from_host, ( | ||
| cast_info.host, cast_info.port, cast_info.uuid, | ||
| cast_info.model_name, cast_info.friendly_name | ||
| ), CONNECTION_RETRY, CONNECTION_RETRY_WAIT, CONNECTION_TIMEOUT) | ||
| )) | ||
| self._chromecast = chromecast | ||
| self._status_listener = CastStatusListener(self, chromecast) | ||
| # Initialise connection status as connected because we can only | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -415,3 +415,23 @@ async def test_entry_setup_list_config(hass: HomeAssistantType): | |
| assert len(mock_setup.mock_calls) == 2 | ||
| assert mock_setup.mock_calls[0][1][1] == {'host': 'bla'} | ||
| assert mock_setup.mock_calls[1][1][1] == {'host': 'blu'} | ||
|
|
||
|
|
||
| async def test_entry_setup_platform_not_ready(hass: HomeAssistantType): | ||
| """Test failed setting up entry will raise PlatformNotReady.""" | ||
| await async_setup_component(hass, 'cast', { | ||
| 'cast': { | ||
| 'media_player': { | ||
| 'host': 'bla' | ||
| } | ||
| } | ||
| }) | ||
|
|
||
| with patch( | ||
| 'homeassistant.components.media_player.cast._async_setup_platform', | ||
| return_value=mock_coro(exception=PlatformNotReady)) as mock_setup: | ||
| with pytest.raises(PlatformNotReady): | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Based on the code, this could be just Exception right?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Edit: I see it now.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changed test to throw Exception |
||
| await cast.async_setup_entry(hass, MockConfigEntry(), None) | ||
|
|
||
| assert len(mock_setup.mock_calls) == 1 | ||
| assert mock_setup.mock_calls[0][1][1] == {'host': 'bla'} | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't
pendingalways empty here? From what I understand from the docs,pendingcontains a set of tasks that are not done when the timeout occurs. But there is no timeout configured here...Also, it would be good to cancel all tasks in
pending.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed pending