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

Subscribers

People subscribed via source and target branches