#!/usr/bin/env python

# Copyright (C) 2013 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.

import argparse
import subprocess
import sys
import tempfile

def main():
    parser = argparse.ArgumentParser(description="Compare layout test results between two configurations of WebKit.")

    parser.add_argument("--comparison", action="store", choices=["remote-layer-tree", "accelerated-drawing", "webkit2"], required=True, help="configuration to test")
    parser.add_argument("-2", "--webkit2", action="store_true", default=False, help="use WebKit2 always (some configurations may force this)")
    parser.add_argument('tests', metavar='TESTS', type=str, help='list of LayoutTest subdirectories to run', default=None, nargs="*")

    args = parser.parse_args()

    force_webkit2 = args.webkit2
    if args.comparison == "remote-layer-tree":
        print("Forcing use of WebKit2, as the remote layer tree depends on WebKit2.")
        force_webkit2 = True

    if args.comparison == "webkit2" and force_webkit2:
        print("It doesn't make sense to test WebKit1 vs. WebKit2 *and* force WebKit2 on.")
        sys.exit(1)

    configuration_flag = flag_for_comparison(args.comparison)

    results_directory = tempfile.mkdtemp(prefix="webkit-comparison-results-", suffix="-" + args.comparison)

    # Run first in the default configuration, generating new baselines, then run
    # again against those results in the configuration being tested.
    run_webkit_tests(tests=args.tests, results_directory=results_directory, use_webkit2=force_webkit2, additional_arguments=["--no-show-results", "--new-baseline"])
    run_webkit_tests(tests=args.tests, results_directory=results_directory, additional_arguments=[configuration_flag], use_webkit2=force_webkit2)

def flag_for_comparison(comparison_name):
    if comparison_name == "remote-layer-tree":
        return "--remote-layer-tree"
    if comparison_name == "accessibility-isolated-tree":
        return "--accessibility-isolated-tree"
    if comparison_name == "accelerated-drawing":
        return "--accelerated-drawing"
    if comparison_name == "webkit2":
        return "-2"

    print("Unknown comparison:", comparison_name)
    sys.exit(1)

def run_webkit_tests(tests, results_directory, use_webkit2, additional_arguments=[]):
    if use_webkit2:
        use_webkit2_arguments = ["-2"]
    else:
        use_webkit2_arguments = []

    subprocess.call(["run-webkit-tests", "-p", "--force", "--treat-ref-tests-as-pixel-tests", "--additional-platform-directory=" + results_directory, "--run-singly", "--no-retry-failures"] + use_webkit2_arguments + additional_arguments + tests)

if __name__ == '__main__':
    main()
