# Copyright 2022 The Cobalt Authors. All Rights Reserved.
#
# 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.
"""Starboard Android X86 Platform Test Filters."""

from starboard.android.shared import test_filters as shared_test_filters
from starboard.tools.testing import test_filter


def CreateTestFilters():
  return AndroidX86TestFilters()


class AndroidX86TestFilters(shared_test_filters.TestFilters):
  """Starboard Android X86 Platform Test Filters."""

  def GetTestFilters(self):
    filters = super(AndroidX86TestFilters, self).GetTestFilters()
    for target, tests in self._FILTERED_TESTS.iteritems():
      filters.extend(test_filter.TestFilter(target, test) for test in tests)
    return filters

  # A map of failing or crashing tests per target
  _FILTERED_TESTS = {
      'nplb': [
          'SbAccessibilityTest.CallSetCaptionsEnabled',
          'SbAccessibilityTest.GetCaptionSettingsReturnIsValid',
          'SbAudioSinkTest.*',
          'SbMediaCanPlayMimeAndKeySystem.*',
          'SbMicrophoneCloseTest.*',
          'SbMicrophoneOpenTest.*',
          'SbMicrophoneReadTest.*',
          'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.*',
          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
          '.WriteContinuedLimitedInput/*',
          'SbMediaSetAudioWriteDurationTests/SbMediaSetAudioWriteDurationTest'
          '.WriteLimitedInput/*',
      ],
      'player_filter_tests': [
          'AudioDecoderTests/*',
          'VideoDecoderTests/*',
          'PlayerComponentsTests/*',
      ],
  }
