sapling/eden/integration/rc_test.py
Adam Simpkins ec0f87fa4d update eden list to report the mount state information
Summary:
Update the `eden list` command to also report the current state for each
checkout if it is not running normally.  Also added a `--json` flag to
print information as JSON so it can be consumed programmatically.

Reviewed By: strager

Differential Revision: D13503053

fbshipit-source-id: 4ef366f5bf4a1157036fdfd7ff1056079588e802
2019-01-25 16:38:28 -08:00

133 lines
4.5 KiB
Python

#!/usr/bin/env python3
#
# Copyright (c) 2016-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.
import os
import stat
import tempfile
import textwrap
from eden.cli import util
from .lib import testcase
@testcase.eden_repo_test
class RCTest(testcase.EdenRepoTest):
def populate_repo(self) -> None:
self.repo.write_file("readme.txt", "test\n")
self.repo.commit("Initial commit.")
def test_eden_list(self) -> None:
mounts = self.eden.run_cmd("list")
self.assertEqual(f"{self.mount}\n", mounts)
self.eden.remove(self.mount)
mounts = self.eden.run_cmd("list")
self.assertEqual("", mounts, msg="There should be 0 mount paths after remove")
self.eden.clone(self.repo_name, self.mount)
mounts = self.eden.run_cmd("list")
self.assertEqual(f"{self.mount}\n", mounts)
def test_unmount_rmdir(self) -> None:
clients = os.path.join(self.eden_dir, "clients")
client_names = os.listdir(clients)
self.assertEqual(1, len(client_names), msg="There should only be 1 client")
test_client_dir = os.path.join(clients, client_names[0])
# Eden list command uses keys of directory map to get mount paths
mounts = self.eden.list_cmd_simple()
self.assertEqual({self.mount: "RUNNING"}, mounts)
self.eden.remove(self.mount)
self.assertFalse(os.path.isdir(test_client_dir))
# Check that _remove_path_from_directory_map in remove is successful
mounts = self.eden.list_cmd_simple()
self.assertEqual({}, mounts, msg="There should be 0 paths in the directory map")
self.eden.clone(self.repo_name, self.mount)
self.assertTrue(
os.path.isdir(test_client_dir),
msg="Client name should be restored verbatim because \
it should be a function of the mount point",
)
mounts = self.eden.list_cmd_simple()
self.assertEqual(
{self.mount: "RUNNING"},
mounts,
msg="The client directory should have been restored",
)
def test_override_system_config(self) -> None:
system_repo = self.create_repo("system_repo")
system_repo.write_file("hello.txt", "hola\n")
system_repo.commit("Initial commit.")
repo_info = util.get_repo(system_repo.path)
assert repo_info is not None
# Create temporary system config
f, path = tempfile.mkstemp(dir=self.system_config_dir, suffix=".toml")
# Add system_repo to system config file
config = textwrap.dedent(
f"""\
["repository {self.repo_name}"]
path = "{repo_info.source}"
type = "{repo_info.type}"
"""
)
os.write(f, config.encode("utf-8"))
os.close(f)
# Clone repository
mount_path = os.path.join(self.mounts_dir, self.repo_name + "-1")
self.eden.clone(self.repo_name, mount_path)
# Verify that clone used repository data from user config
readme = os.path.join(mount_path, "hello.txt")
self.assertFalse(os.path.exists(readme))
hello = os.path.join(mount_path, "readme.txt")
st = os.lstat(hello)
self.assertTrue(stat.S_ISREG(st.st_mode))
with open(hello, "r") as hello_file:
self.assertEqual("test\n", hello_file.read())
# Add system_repo to system config file with new name
repo_name = "repo"
f = os.open(path, os.O_WRONLY)
config = textwrap.dedent(
f"""\
["repository {repo_name}"]
path = "{repo_info.source}"
type = "{repo_info.type}"
"""
)
os.write(f, config.encode("utf-8"))
os.close(f)
# Clone repository
mount_path = os.path.join(self.mounts_dir, repo_name + "-1")
self.eden.clone(repo_name, mount_path)
# Verify that clone used repository data from system config
readme = os.path.join(mount_path, "readme.txt")
self.assertFalse(os.path.exists(readme))
hello = os.path.join(mount_path, "hello.txt")
st = os.lstat(hello)
self.assertTrue(stat.S_ISREG(st.st_mode))
with open(hello, "r") as hello_file:
self.assertEqual("hola\n", hello_file.read())