Mir

Merge lp:~albaguirre/mir/fix-1537798 into lp:mir

Proposed by Alberto Aguirre
Status: Merged
Approved by: Alberto Aguirre
Approved revision: no longer in the source branch.
Merged at revision: 3275
Proposed branch: lp:~albaguirre/mir/fix-1537798
Merge into: lp:mir
Diff against target: 136 lines (+48/-48)
1 file modified
tests/acceptance-tests/test_nested_mir.cpp (+48/-48)
To merge this branch: bzr merge lp:~albaguirre/mir/fix-1537798
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Kevin DuBois (community) Approve
Alan Griffiths Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+284202@code.launchpad.net

Commit message

Fix race in NestedServer.client_sees_set_scaling_factor (LP: #1537798)

Wait until the display configuration is applied before creating a client surface of the nested server;
otherwise the first surface output event will race against the update of the display configuration.

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3275
https://mir-jenkins.ubuntu.com/job/mir-ci/174/
Executed test runs:
    None: https://mir-jenkins.ubuntu.com/job/generic-update-mp/174/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/174/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:3275
http://jenkins.qa.ubuntu.com/job/mir-ci/6145/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-android-vivid-i386-build/5716
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-clang-vivid-amd64-build/4623
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-vivid-touch/5672
    FAILURE: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-xenial-touch/349/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/469
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/469/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/469
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/469/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5669
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5669/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-touch/8099
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27107
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/345
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/345/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-xenial-touch/201/console
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27108

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/mir-ci/6145/rebuild

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Pre-existing but...

+ /* Now, because we have absolutely no idea when the call to set_base_configuration will *actually*
+ * set the base configuration we get to poll configuration() until we see that it's actually changed.
+ */

...it would be better to use a custom DisplayConfigurationReport to detect the config change. Unfortunately, MediatingDisplayChanger::apply_config() notifies the change before applying it (which is probably wrong).

review: Approve
Revision history for this message
Kevin DuBois (kdub) wrote :

lgtm

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

^-- Looks unrelated. Captured in lp:1539321

Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/acceptance-tests/test_nested_mir.cpp'
2--- tests/acceptance-tests/test_nested_mir.cpp 2016-01-23 01:38:43 +0000
3+++ tests/acceptance-tests/test_nested_mir.cpp 2016-01-28 03:58:00 +0000
4@@ -330,6 +330,46 @@
5
6 return std::make_shared<mtd::StubDisplayConfig>(new_displays);
7 }
8+
9+ void change_display_configuration(NestedMirRunner& nested_mir, float scale, MirFormFactor form_factor)
10+ {
11+ auto const configurator = nested_mir.server.the_display_configuration_controller();
12+ std::shared_ptr<mg::DisplayConfiguration> config = nested_mir.server.the_display()->configuration();
13+
14+ config->for_each_output([scale, form_factor] (mg::UserDisplayConfigurationOutput& output)
15+ {
16+ output.scale = scale;
17+ output.form_factor = form_factor;
18+ });
19+
20+ configurator->set_base_configuration(config);
21+ }
22+
23+ bool wait_for_display_configuration_change(NestedMirRunner& nested_mir, float expected_scale, MirFormFactor expected_form_factor)
24+ {
25+ using namespace std::literals::chrono_literals;
26+ /* Now, because we have absolutely no idea when the call to set_base_configuration will *actually*
27+ * set the base configuration we get to poll configuration() until we see that it's actually changed.
28+ */
29+ auto const end_time = std::chrono::steady_clock::now() + 10s;
30+ bool done{false};
31+ while (!done && (std::chrono::steady_clock::now() < end_time))
32+ {
33+ auto const new_config = nested_mir.server.the_display()->configuration();
34+
35+ new_config->for_each_output([&done, expected_scale, expected_form_factor] (auto const& output)
36+ {
37+ if (output.scale == expected_scale &&
38+ output.form_factor == expected_form_factor)
39+ {
40+ done = true;
41+ }
42+ });
43+ if (!done)
44+ std::this_thread::sleep_for(100ms);
45+ }
46+ return done;
47+ }
48 };
49
50 struct Client
51@@ -472,64 +512,27 @@
52
53 TEST_F(NestedServer, shell_sees_set_scaling_factor)
54 {
55- using namespace std::literals::chrono_literals;
56 NestedMirRunner nested_mir{new_connection()};
57
58 constexpr float expected_scale{2.3f};
59 constexpr MirFormFactor expected_form_factor{mir_form_factor_tv};
60
61- auto const configurator = nested_mir.server.the_display_configuration_controller();
62- std::shared_ptr<mg::DisplayConfiguration> config = nested_mir.server.the_display()->configuration();
63-
64- config->for_each_output([] (mg::UserDisplayConfigurationOutput& output)
65- {
66- output.scale = expected_scale;
67- output.form_factor = expected_form_factor;
68- });
69-
70- configurator->set_base_configuration(config);
71-
72- /* Now, because we have absolutely no idea when the call to set_base_configuration will *actually*
73- * set the base configuration we get to poll configuration() until we see that it's actually changed.
74- */
75- auto const end_time = std::chrono::steady_clock::now() + 10s;
76- bool done{false};
77- while (!done && (std::chrono::steady_clock::now() < end_time))
78- {
79- auto const new_config = nested_mir.server.the_display()->configuration();
80-
81- new_config->for_each_output([&done, expected_scale, expected_form_factor] (auto const& output)
82- {
83- if (output.scale == expected_scale &&
84- output.form_factor == expected_form_factor)
85- {
86- done = true;
87- }
88- });
89- }
90-
91- EXPECT_THAT(std::chrono::steady_clock::now(), Le(end_time)) << "Timed out waiting for display configuration to propagate";
92+ change_display_configuration(nested_mir, expected_scale, expected_form_factor);
93+ auto const config_applied = wait_for_display_configuration_change(nested_mir, expected_scale, expected_form_factor);
94+
95+ EXPECT_TRUE(config_applied);
96 }
97
98 TEST_F(NestedServer, client_sees_set_scaling_factor)
99 {
100- using namespace std::literals::chrono_literals;
101-
102 NestedMirRunner nested_mir{new_connection()};
103
104 constexpr float expected_scale{2.3f};
105 constexpr MirFormFactor expected_form_factor{mir_form_factor_tv};
106
107- auto const configurator = nested_mir.server.the_display_configuration_controller();
108- std::shared_ptr<mg::DisplayConfiguration> config = nested_mir.server.the_display()->configuration();
109-
110- config->for_each_output([] (mg::UserDisplayConfigurationOutput& output)
111- {
112- output.scale = expected_scale;
113- output.form_factor = expected_form_factor;
114- });
115-
116- configurator->set_base_configuration(config);
117+ change_display_configuration(nested_mir, expected_scale, expected_form_factor);
118+ auto const config_applied = wait_for_display_configuration_change(nested_mir, expected_scale, expected_form_factor);
119+ EXPECT_TRUE(config_applied);
120
121 Client client{nested_mir};
122
123@@ -554,12 +557,9 @@
124 auto surface = mir_surface_create_sync(spec);
125 mir_surface_spec_release(spec);
126
127- auto stream = mir_surface_get_buffer_stream(surface);
128- mir_buffer_stream_swap_buffers_sync(stream);
129+ EXPECT_TRUE(surface_event_received.wait_for(30s));
130
131 mir_surface_release_sync(surface);
132-
133- EXPECT_TRUE(surface_event_received.wait_for(30s));
134 }
135
136 //////////////////////////////////////////////////////////////////

Subscribers

People subscribed via source and target branches