#!/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()
