Mir

Merge lp:~vanvugt/mir/compositor-test-in-c-minor into lp:mir

Proposed by Daniel van Vugt
Status: Merged
Approved by: Daniel van Vugt
Approved revision: no longer in the source branch.
Merged at revision: 3503
Proposed branch: lp:~vanvugt/mir/compositor-test-in-c-minor
Merge into: lp:mir
Diff against target: 267 lines (+232/-1)
4 files modified
debian/mir-test-tools.install (+1/-0)
tests/performance-tests/CMakeLists.txt (+7/-0)
tests/performance-tests/performance_tests.sh (+2/-1)
tests/performance-tests/test_compositor.cpp (+222/-0)
To merge this branch: bzr merge lp:~vanvugt/mir/compositor-test-in-c-minor
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Kevin DuBois (community) Approve
Review via email: mp+293986@code.launchpad.net

Commit message

Add a compositor performance test, which is actually a regression test
for LP: #1563287.

Description of the change

This is the same test as before:
  https://code.launchpad.net/~vanvugt/mir/compositor-test/+merge/292608
but rewritten from shell script into C/Gtest.

And now you can see the compositor test running in CI. Just not easily...
 1. Click on the job that has 'arch=cross-armhf'
 2. Click 'Console Output'
 3. Scroll to bottom and click 'device-runtests-mir ...'
 4. Click 'krillin'
 5. Click 'Console Output'
 6. Click 'Full Log'
 7. Search in page 'Mir Performance Tests'

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

PASSED: Continuous integration, rev:3507
https://mir-jenkins.ubuntu.com/job/mir-ci/952/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/1019
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/1065
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1056
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1056
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1029
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1029/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1029
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1029/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1029
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1029/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1029
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1029/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1029
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1029/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3509
https://mir-jenkins.ubuntu.com/job/mir-ci/956/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/1023/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/1069
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1060
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1060
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1033
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1033/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1033
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1033/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1033/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1033/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1033
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1033/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1033
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1033/artifact/output/*zip*/output.zip

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Harmless phone failure. Try again...

03:34:13 Slave went offline during the build
03:34:13 ERROR: Connection was broken: java.io.EOFException

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3510
https://mir-jenkins.ubuntu.com/job/mir-ci/958/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/1027
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/1073
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1064
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1064
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1037
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1037/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1037
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1037/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1037
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1037/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1037
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1037/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1037
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1037/artifact/output/*zip*/output.zip

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

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

Would prefer this to the bash.

+ EXPECT_GE(compositor_fps, 58.0f);
iirc, we've had 55fps devices before. (and krillin is 66fps). Would be better to check the display configuration

+ bin_dir+"/mir_demo_server --compositor-report=log -f "+mir_sock;
Would prefer to override the compositor report, so then we would rely on our API instead of log parsing. We could also probably use our existing test infrastructure for starting servers? (although, we probably need some hygiene by now to get the acceptance tests to run against the real drivers easily.)

So I guess (given the difficulties of using our test infrastructure + server API to check this), alright by me, after making the compositor fps check a bit more robust.

review: Approve
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

55Hz: I don't recall 55Hz devices. We can lower the threshold if required. When the bug occurs on krillin through you see a drop from 66FPS to 9-20FPS.

Overriding the compositor report is inappropriately cumbersome, but also is not possible for any tests that might have more than one test due to Android bug 1546912. This is why all-but-one of the glmark2 tests are disabled on Android right now too.

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/257/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/1036/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/277/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/1083
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1074
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1074
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/1046/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1046
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/1046/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1046
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/1046/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1046
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/1046/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1046
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/1046/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Just bug 1576690. Try again.

Revision history for this message
Mir CI Bot (mir-ci-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/mir-test-tools.install'
2--- debian/mir-test-tools.install 2016-05-03 04:36:33 +0000
3+++ debian/mir-test-tools.install 2016-05-09 08:40:31 +0000
4@@ -6,6 +6,7 @@
5 usr/bin/mir_integration_tests*
6 usr/bin/mir_performance_tests
7 usr/bin/mir_glmark2_performance_test
8+usr/bin/mir_compositor_performance_test
9 usr/bin/mir_privileged_tests
10 usr/bin/mir_test_reload_protobuf
11 usr/bin/mir_test_client_*
12
13=== modified file 'tests/performance-tests/CMakeLists.txt'
14--- tests/performance-tests/CMakeLists.txt 2016-04-27 09:21:20 +0000
15+++ tests/performance-tests/CMakeLists.txt 2016-05-09 08:40:31 +0000
16@@ -16,3 +16,10 @@
17 mirserver
18 ${GTEST_BOTH_LIBRARIES}
19 )
20+
21+mir_add_wrapped_executable(mir_compositor_performance_test
22+ test_compositor.cpp
23+)
24+target_link_libraries(mir_compositor_performance_test
25+ ${GTEST_BOTH_LIBRARIES}
26+)
27
28=== modified file 'tests/performance-tests/performance_tests.sh'
29--- tests/performance-tests/performance_tests.sh 2016-04-22 05:09:40 +0000
30+++ tests/performance-tests/performance_tests.sh 2016-05-09 08:40:31 +0000
31@@ -30,7 +30,8 @@
32
33 tests_run=0
34 failures=0
35-for perf_test in mir_glmark2_performance_test
36+for perf_test in mir_glmark2_performance_test \
37+ mir_compositor_performance_test
38 do
39 title_banner "Mir Performance Tests now running: $perf_test"
40 tests_run=$(($tests_run + 1))
41
42=== added file 'tests/performance-tests/test_compositor.cpp'
43--- tests/performance-tests/test_compositor.cpp 1970-01-01 00:00:00 +0000
44+++ tests/performance-tests/test_compositor.cpp 2016-05-09 08:40:31 +0000
45@@ -0,0 +1,222 @@
46+/*
47+ * Copyright © 2016 Canonical Ltd.
48+ *
49+ * This program is free software: you can redistribute it and/or modify it
50+ * under the terms of the GNU General Public License version 3,
51+ * as published by the Free Software Foundation.
52+ *
53+ * This program is distributed in the hope that it will be useful,
54+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
55+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
56+ * GNU General Public License for more details.
57+ *
58+ * You should have received a copy of the GNU General Public License
59+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
60+ *
61+ * Author: Daniel van Vugt <daniel.van.vugt@canonical.com>
62+ */
63+
64+#include <gtest/gtest.h>
65+#include <cstdio>
66+#include <cstdlib>
67+#include <cstring>
68+#include <unistd.h>
69+#include <string>
70+#include <thread>
71+#include <initializer_list>
72+
73+using namespace std::literals::chrono_literals;
74+
75+namespace
76+{
77+
78+std::string mir_bin_dir()
79+{
80+ char path[256];
81+ auto len = readlink("/proc/self/exe", path, sizeof(path)-1);
82+ if (len < 0)
83+ len = 0;
84+ path[len] = '\0';
85+ if (auto slash = strrchr(path, '/'))
86+ *slash = '\0';
87+ return path;
88+}
89+
90+void kill_nicely(pid_t pid)
91+{
92+ if (kill(pid, SIGTERM) < 0)
93+ return;
94+ int const timeout = 5;
95+ int status, count = 0;
96+ while (0 == waitpid(pid, &status, WNOHANG) && count < timeout)
97+ {
98+ sleep(1);
99+ ++count;
100+ }
101+ kill(pid, SIGKILL);
102+}
103+
104+int exec_cmd(char const* cmd)
105+{
106+ auto buf = strdup(cmd);
107+ size_t argc = 1;
108+ char* argv[256] = {buf};
109+ char *c = buf;
110+ while (*c)
111+ {
112+ if (*c == ' ')
113+ {
114+ *c = '\0';
115+ if (argc < (sizeof(argv)/sizeof(argv[0]) - 1))
116+ {
117+ argv[argc] = c + 1;
118+ ++argc;
119+ }
120+ }
121+ ++c;
122+ }
123+ argv[argc] = NULL;
124+ return execv(argv[0], argv);
125+}
126+
127+FILE* popen_with_pid(char const* cmd, pid_t& pid)
128+{
129+ int pipefd[2];
130+ if (pipe(pipefd))
131+ return NULL;
132+
133+ int const& pipe_out = pipefd[0];
134+ int const& pipe_in = pipefd[1];
135+
136+ pid = fork();
137+ if (pid < 0)
138+ {
139+ close(pipe_in);
140+ close(pipe_out);
141+ return NULL;
142+ }
143+ else if (pid == 0)
144+ {
145+ close(pipe_out);
146+ dup2(pipe_in, 1); // Child stdout goes into pipe_in
147+ close(pipe_in);
148+ exec_cmd(cmd);
149+ exit(errno);
150+ }
151+ else
152+ {
153+ close(pipe_in);
154+ }
155+
156+ return fdopen(pipe_out, "r");
157+}
158+
159+bool spawn_and_forget(char const* cmd)
160+{
161+ int pid = fork();
162+ if (pid == 0)
163+ {
164+ // Silence stdout/stderr
165+ close(1);
166+ close(2);
167+ exec_cmd(cmd);
168+ exit(errno);
169+ }
170+ return (pid > 0);
171+}
172+
173+bool spawn_and_forget(std::string const& cmd)
174+{
175+ return spawn_and_forget(cmd.c_str());
176+}
177+
178+bool wait_for_file(char const* path, std::chrono::seconds timeout)
179+{
180+ struct stat s;
181+ int count = 0, max = timeout.count();
182+ int ret;
183+ while ((ret = stat(path, &s)) < 0 && errno == ENOENT && count < max)
184+ {
185+ ++count;
186+ std::this_thread::sleep_for(1s);
187+ }
188+ return ret == 0;
189+}
190+
191+struct CompositorPerformance : testing::Test
192+{
193+ void SetUp() override
194+ {
195+ compositor_fps = compositor_render_time = -1.0f;
196+
197+ auto const mir_sock = "/tmp/mir_test_socket_"+std::to_string(getpid());
198+ auto const server_cmd =
199+ bin_dir+"/mir_demo_server --compositor-report=log -f "+mir_sock;
200+
201+ server_output = popen_with_pid(server_cmd.c_str(), server_pid);
202+ ASSERT_TRUE(server_output) << server_cmd;
203+ ASSERT_TRUE(wait_for_file(mir_sock.c_str(), 5s)) << server_cmd;
204+ setenv("MIR_SOCKET", mir_sock.c_str(), 1);
205+ }
206+
207+ void TearDown() override
208+ {
209+ kill_nicely(server_pid);
210+ fclose(server_output);
211+ }
212+
213+ void spawn_clients(std::initializer_list<std::string> clients)
214+ {
215+ for (auto& client : clients)
216+ {
217+ spawn_and_forget(bin_dir+"/"+client);
218+ std::this_thread::sleep_for(100ms);
219+ }
220+ }
221+
222+ void wait_for_server(std::chrono::seconds timeout)
223+ {
224+ pid_t pid = server_pid;
225+ std::thread killer([timeout,pid]()
226+ {
227+ std::this_thread::sleep_for(timeout);
228+ kill_nicely(pid);
229+ });
230+ killer.detach();
231+
232+ char line[256];
233+ while (fgets(line, sizeof(line), server_output))
234+ {
235+ if (char const* perf = strstr(line, "averaged "))
236+ {
237+ float fps, render_time;
238+ if (2 == sscanf(perf, "averaged %f FPS, %f ms/frame",
239+ &fps, &render_time))
240+ {
241+ compositor_fps = fps;
242+ compositor_render_time = render_time;
243+ }
244+ }
245+ }
246+ }
247+
248+ std::string const bin_dir{mir_bin_dir()};
249+ pid_t server_pid = 0;
250+ FILE* server_output;
251+ float compositor_fps, compositor_render_time;
252+};
253+
254+} // anonymous namespace
255+
256+TEST_F(CompositorPerformance, regression_test_1563287)
257+{
258+ spawn_clients({"mir_demo_client_flicker",
259+ "mir_demo_client_egltriangle -b0.5 -f",
260+ "mir_demo_client_progressbar",
261+ "mir_demo_client_scroll",
262+ "mir_demo_client_egltriangle -b0.5",
263+ "mir_demo_client_multiwin"});
264+ wait_for_server(10s);
265+ EXPECT_GE(compositor_fps, 58.0f);
266+ EXPECT_LT(compositor_render_time, 17.0f);
267+}

Subscribers

People subscribed via source and target branches