Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f58625d9 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Introduce libsurfaceflinger_unittest

This is meant to be a framework for running function-level unit tests
against the various SurfaceFlinger classes.

The point of this patch is to set up the test framework, as well as
demonstrate a pattern to be used to allow private implementation
functions to be tested.

Note that this patch configures the base surfaceflinger code to now use
ThinLTO, and enables -fwhole-program-vtables. This is done as ThinLTO
with that option will perform a devirtualization pass, turning virtual
function calls back into non-virtual function calls (and possibly even
inlining the call) when it detects that there is only one possible
implementation being called. The cost is a slight increase in build time
(similar to -O2), but is still much less than the original LTO.

Even here that LTO pass does something to the surfaceflinger binary,
reducing the file size by 4Kb.

Test: libsurfaceflinger_unittest passes on Pixel XL
Test: atest libsurfaceflinger_unittest runs the new test
Bug: None
Change-Id: I362ec1fcf1a909c4d6769710d8d8a6b0b158600d
parent 66ce40d9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@ cc_defaults {
        "-DGL_GLEXT_PROTOTYPES",
        "-DEGL_EGLEXT_PROTOTYPES",
    ],
    logtags: ["EventLog/EventLogTags.logtags"],
    shared_libs: [
        "android.frameworks.vr.composer@1.0",
        "android.hardware.configstore-utils",
@@ -131,10 +130,17 @@ cc_library_shared {
    srcs: [
        ":libsurfaceflinger_sources",
    ],
    logtags: ["EventLog/EventLogTags.logtags"],
    include_dirs: [
        "external/vulkan-validation-layers/libs/vkjson",
        "frameworks/native/vulkan/include",
    ],
    cppflags: [
        "-fwhole-program-vtables",  // requires ThinLTO
    ],
    lto: {
        thin: true,
    },
}

cc_binary {
+3 −0
Original line number Diff line number Diff line
@@ -316,6 +316,9 @@ private:
    friend class BufferLayer;
    friend class MonitoredProducer;

    // For unit tests
    friend class TestableSurfaceFlinger;

    // This value is specified in number of frames.  Log frame stats at most
    // every half hour.
    enum { LOG_FRAME_STATS_PERIOD =  30*60*60 };
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ cc_test {
subdirs = [
    "fakehwc",
    "hwc2",
    "unittests",
    "vsync",
    "waitforvsync",
]
+30 −0
Original line number Diff line number Diff line
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

cc_test {
    name: "libsurfaceflinger_unittest",
    tags: ["test"],
    defaults: ["libsurfaceflinger_defaults"],
    test_suites: ["device-tests"],
    srcs: [
        ":libsurfaceflinger_sources",
        "DisplayTransactionTest.cpp",
    ],
    static_libs: [
        "libgmock",
    ],
    header_libs: [
        "libsurfaceflinger_headers",
    ],
}
+26 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<configuration description="Config for libsurfaceflinger_unittest">
    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="cleanup" value="true" />
        <option name="push" value="libsurfaceflinger_unittest->/data/local/tmp/libsurfaceflinger_unittest" />
    </target_preparer>
    <option name="test-suite-tag" value="apct" />
    <test class="com.android.tradefed.testtype.GTest" >
        <option name="native-test-device-path" value="/data/local/tmp" />
        <option name="module-name" value="libsurfaceflinger_unittest" />
    </test>
</configuration>
Loading