#!/usr/bin/env python
# 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.
"""Entrypoint for running unit-tests shards in docker"""

import json
import logging
import os
import subprocess
import sys
import time

log = logging.getLogger(__name__)


def exc(cmd, check=False):
  log.info(cmd)
  try:
    output = subprocess.check_output(cmd, shell=True)
    log.info(output)
  except subprocess.CalledProcessError:
    if check:
      raise


def main(argv):
  shard_index = None
  if len(argv) >= 2:
    shard_index = int(argv[1])

  out_dir = '/out'

  exc(f'unzip -q {out_dir}/app_launcher -d /app_launcher_out')

  xvfb_prefix = ('xvfb-run -a --server-args="-screen 0 1920x1080x24'
                 '+render +extension GLX -noreset"')
  env_platform = os.getenv('PLATFORM')
  env_config = os.getenv('CONFIG')
  test_command = [
      'python3', '/app_launcher_out/starboard/tools/testing/test_runner.py',
      '--run', '-o', out_dir, '-p', env_platform, '-c', env_config, '-l'
  ]

  if shard_index is not None:
    test_command.append('-s')
    test_command.append(str(shard_index))

  test_command = ' '.join(test_command)

  start_t = time.time()
  exc(f'{xvfb_prefix} {test_command}')
  end_t = time.time()

  # Output shard timing information to file.
  duration_t = (end_t - start_t) / 60.0
  shard_timing_json = f'{out_dir}/shard_timing.json'
  try:
    with open(shard_timing_json, 'r', encoding='utf-8') as f:
      json_content = json.loads(f.read())
  except FileNotFoundError:
    json_content = {}
  json_content[str(shard_index)] = f'{duration_t:.2f}'
  with open(shard_timing_json, 'w+', encoding='utf-8') as f:
    json.dump(json_content, f, sort_keys=True, indent=2)


if __name__ == '__main__':
  logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  main(sys.argv)
