14546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Copyright (C) 2016 The Android Open Source Project
24546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond#
34546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Licensed under the Apache License, Version 2.0 (the "License");
44546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# you may not use this file except in compliance with the License.
54546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# You may obtain a copy of the License at
64546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond#
74546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond#      http://www.apache.org/licenses/LICENSE-2.0
84546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond#
94546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Unless required by applicable law or agreed to in writing, software
104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# distributed under the License is distributed on an "AS IS" BASIS,
114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# See the License for the specific language governing permissions and
134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# limitations under the License.
144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom __future__ import absolute_import
164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport re
184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport itertools
194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.test_base_remote import TestBaseRemote
214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.decorators import (
224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    ordered_test,
234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    wimpy,
244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    skip_conditional,
254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond)
264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.assert_mixins import CoordinateAssertionsMixin
274546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
284546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom reduce_common import (
294546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    REDUCE_SCRIPT,
304546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    REDUCE_AUTO_COMB_SCRIPT,
314546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    ReductionMixin,
324546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond)
334546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
344546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
354546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondmultithreaded = lambda: skip_conditional(
364546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    lambda self: self.cpu_count == 1,
374546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    "skipping multithreaded test (1 CPU present)"
384546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond)
394546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
404546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
414546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondclass TestReduceCombinerMultithreaded(
424546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        TestBaseRemote, CoordinateAssertionsMixin, ReductionMixin):
434546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    """
444546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    RenderScript reduction combiners are currently run only on the output of a
454546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    parallel reduction step for the CPU reference implementation.  These
464546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    testcases test LLDB's handling of breakpoints for the combiner function.
474546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    """
484546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
494546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    bundle_target = {
504546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        'java': 'Reduction',
514546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    }
524546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
534546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def _delete_breakpoints(self):
544546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        try:
554546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            self.do_command('breakpoint delete -f')
564546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        except self.TestFail:
574546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            pass
584546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
594546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def setup(self, android):
604546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        """
614546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        This test *must* be run on multiple threads, and is skipped if the
624546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        device does not support multiple threads
634546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        """
644546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        cpu_spec = android.shell("cat /sys/devices/system/cpu/online").strip()
654546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        match = re.search(r'(^0(-\d+)?(,\d+([-]\d*)?)*)$', cpu_spec)
664546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        if not match or not match.groups():
674546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            raise self.TestFail(
684546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                "unable to parse number of available CPUs in %r" % cpu_spec)
694546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
704546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        def parse_range(s):
714546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            r = s.split('-')
724546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            if len(r) == 1:
734546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                return 1
744546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            return int(r[1]) - int(r[0])
754546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
764546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        self.cpu_count = sum(map(parse_range, cpu_spec.split(',')))
774546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        android.push_prop('debug.rs.max-threads', self.cpu_count + 1)
784546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
794546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def teardown(self, android):
804546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        """Reset the number of RS threads to the previous value."""
814546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        android.pop_prop('debug.rs.max-threads')
824546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
834546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @multithreaded()
844546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @ordered_test(0)
854546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @wimpy
864546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def test_setup(self):
874546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        self.try_command('language renderscript status', [])
884546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        # first point of order: make sure the compiled script is properly
894546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        # loaded and that we can set a breakpoint on the named reduction
904546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        self.try_command(
914546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'language renderscript reduction breakpoint set find_min_user_type_auto_comb')
924546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        self.try_command(
934546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'process continue',
944546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            expected_regex=[
954546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                r'Process \d+ stopped',
96506520732420b196f4f17d67596fd81004faf009Luke Drummond                r'frame #0: (0x[0-9a-fA-F]+ )?librs.reduce_auto_comb.so`'
974546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            ]
984546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        )
994546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1004546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @multithreaded()
1014546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def test_function_role_breakpoints_combinations(self):
1024546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        func_role_combinations = itertools.combinations(
1034546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            ('accumulator', 'outconverter', 'initializer', 'combiner'),
1044546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            r=2
1054546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        )
1064546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        self._test_func_role_combinations(func_role_combinations)
1074546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1084546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @multithreaded()
1094546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def test_reduction_breakpoint_set_single_type_user_comb(self):
1104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        return self._reduction_breakpoint_set_single_type(
1114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'reduce',
1124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            REDUCE_SCRIPT,
1134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'find_min_user_type',
1144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            (
1154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_init', 'initializer'),
1164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_accum', 'accumulator'),
1174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_comb', 'combiner'),
1184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_outc', 'outconverter')
1194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            )
1204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        )
1214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond
1224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    @multithreaded()
1234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond    def test_reduction_breakpoint_set_single_type_auto_comb(self):
1244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        return self._reduction_breakpoint_set_single_type(
1254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'reduce_auto_comb',
1264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            REDUCE_AUTO_COMB_SCRIPT,
1274546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            'find_min_user_type_auto_comb',
1284546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            (
1294546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_init', 'initializer'),
1304546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_accum', 'accumulator'),
1314546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_accum.combiner', 'combiner'),
1324546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond                ('find_min_user_type_outc', 'outconverter')
1334546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond            )
1344546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond        )
135