#!/usr/bin/env vpython3
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Smoke tests for gclient.py.

Shell out 'gclient' and run cipd tests.
"""

import logging
import os
import sys
import unittest

import gclient_smoketest_base

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

CHROME_INFRA_URL = "https://chrome-infra-packages.appspot.com"


class GClientSmokeCipd(gclient_smoketest_base.GClientSmokeBase):
    def setUp(self):
        super(GClientSmokeCipd, self).setUp()
        self.enabled = self.FAKE_REPOS.set_up_git()
        if not self.enabled:
            self.skipTest("git fake repos not available")
        self.env["PATH"] = (
            os.path.join(ROOT_DIR, "testing_support")
            + os.pathsep
            + self.env["PATH"]
        )

    def testSyncCipd(self):
        self.gclient(
            ["config", self.git_base + "repo_14", "--name", "src", "--managed"]
        )
        self.gclient(["sync"])

        tree = self.mangle_git_tree(("repo_14@1", "src"))
        tree.update(
            {
                "_cipd": "\n".join(
                    [
                        "$ParanoidMode CheckPresence",
                        "$OverrideInstallMode copy",
                        "",
                        "@Subdir src/another_cipd_dep",
                        "package1 1.1-cr0",
                        "package2 1.13",
                        "",
                        "@Subdir src/cipd_dep",
                        "package0 0.1",
                        "",
                        "@Subdir src/cipd_dep_with_cipd_variable",
                        "package3/${platform} 1.2",
                        "",
                        "",
                    ]
                ),
                "src/another_cipd_dep/_cipd": "\n".join(
                    [
                        "package1 1.1-cr0",
                        "package2 1.13",
                    ]
                ),
                "src/cipd_dep/_cipd": "package0 0.1",
                "src/cipd_dep_with_cipd_variable/_cipd": "package3/${platform} 1.2",
            }
        )
        self.assertTree(tree)

    def testConvertGitToCipd(self):
        self.gclient(
            ["config", self.git_base + "repo_13", "--name", "src", "--managed"]
        )

        # repo_13@1 has src/repo12 as a git dependency.
        self.gclient(
            ["sync", "-v", "-v", "-v", "--revision", self.githash("repo_13", 1)]
        )

        tree = self.mangle_git_tree(
            ("repo_13@1", "src"), ("repo_12@1", "src/repo12")
        )
        self.assertTree(tree)

        # repo_13@3 has src/repo12 as a cipd dependency.
        self.gclient(
            [
                "sync",
                "-v",
                "-v",
                "-v",
                "--revision",
                self.githash("repo_13", 3),
                "--delete_unversioned_trees",
            ]
        )

        tree = self.mangle_git_tree(("repo_13@3", "src"))
        tree.update(
            {
                "_cipd": "\n".join(
                    [
                        "$ParanoidMode CheckPresence",
                        "$OverrideInstallMode copy",
                        "",
                        "@Subdir src/repo12",
                        "foo 1.3",
                        "",
                        "",
                    ]
                ),
                "src/repo12/_cipd": "foo 1.3",
            }
        )
        self.assertTree(tree)

    def testConvertCipdToGit(self):
        self.gclient(
            ["config", self.git_base + "repo_13", "--name", "src", "--managed"]
        )

        # repo_13@3 has src/repo12 as a cipd dependency.
        self.gclient(
            [
                "sync",
                "-v",
                "-v",
                "-v",
                "--revision",
                self.githash("repo_13", 3),
                "--delete_unversioned_trees",
            ]
        )

        tree = self.mangle_git_tree(("repo_13@3", "src"))
        tree.update(
            {
                "_cipd": "\n".join(
                    [
                        "$ParanoidMode CheckPresence",
                        "$OverrideInstallMode copy",
                        "",
                        "@Subdir src/repo12",
                        "foo 1.3",
                        "",
                        "",
                    ]
                ),
                "src/repo12/_cipd": "foo 1.3",
            }
        )
        self.assertTree(tree)

        # repo_13@1 has src/repo12 as a git dependency.
        self.gclient(
            ["sync", "-v", "-v", "-v", "--revision", self.githash("repo_13", 1)]
        )

        tree = self.mangle_git_tree(
            ("repo_13@1", "src"), ("repo_12@1", "src/repo12")
        )
        tree.update(
            {
                "_cipd": "\n".join(
                    [
                        "$ParanoidMode CheckPresence",
                        "$OverrideInstallMode copy",
                        "",
                        "@Subdir src/repo12",
                        "foo 1.3",
                        "",
                        "",
                    ]
                ),
                "src/repo12/_cipd": "foo 1.3",
            }
        )
        self.assertTree(tree)

    def testRevInfo(self):
        self.gclient(
            ["config", self.git_base + "repo_18", "--name", "src", "--managed"]
        )
        self.gclient(["sync"])
        results = self.gclient(["revinfo"])
        out = (
            "src: %(base)srepo_18\n"
            "src/cipd_dep:package0: %(instance_url1)s\n"
            "src/cipd_dep:package0/${platform}: %(instance_url2)s\n"
            "src/cipd_dep:package1/another: %(instance_url3)s\n"
            % {
                "base": self.git_base,
                "instance_url1": CHROME_INFRA_URL
                + "/package0@package0-fake-tag:1.0",
                "instance_url2": CHROME_INFRA_URL
                + "/package0/${platform}@package0/${platform}-fake-tag:1.0",
                "instance_url3": CHROME_INFRA_URL
                + "/package1/another@package1/another-fake-tag:1.0",
            }
        )
        self.check((out, "", 0), results)

    def testRevInfoActual(self):
        self.gclient(
            ["config", self.git_base + "repo_18", "--name", "src", "--managed"]
        )
        self.gclient(["sync"])
        results = self.gclient(["revinfo", "--actual"])
        out = (
            "src: %(base)srepo_18@%(hash1)s\n"
            "src/cipd_dep:package0: %(instance_url1)s\n"
            "src/cipd_dep:package0/${platform}: %(instance_url2)s\n"
            "src/cipd_dep:package1/another: %(instance_url3)s\n"
            % {
                "base": self.git_base,
                "hash1": self.githash("repo_18", 1),
                "instance_url1":
                # The below 'fake-*' and 'platform-expanded-*' ID's are from:
                # ../testing_support/fake_cipd.py. 'fake-resolved' represents
                # the package being found in the batch resolution mechanism.
                CHROME_INFRA_URL + "/p/package0/+/package0-fake-resolved-id",
                "instance_url2": CHROME_INFRA_URL
                + "/p/package0/platform-expanded-test-only"
                + "/+/package0/${platform}-fake-instance-id",
                "instance_url3": CHROME_INFRA_URL
                + "/p/package1/another"
                + "/+/package1/another-fake-resolved-id",
            }
        )
        self.check((out, "", 0), results)


if __name__ == "__main__":
    if "-v" in sys.argv:
        logging.basicConfig(level=logging.DEBUG)
    unittest.main()
