summaryrefslogtreecommitdiff
path: root/test/test_e2e.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_e2e.py')
-rw-r--r--test/test_e2e.py164
1 files changed, 164 insertions, 0 deletions
diff --git a/test/test_e2e.py b/test/test_e2e.py
new file mode 100644
index 0000000..92ef3d3
--- /dev/null
+++ b/test/test_e2e.py
@@ -0,0 +1,164 @@
+
+import pytest
+import numpy
+import hashlib
+import os
+
+from subprocess import check_call, CalledProcessError, PIPE
+from util import File, check_same_md5sum
+
+
+"""
+End-to-End Test.
+
+Set $MSCP_BIN_PATH env variable for path to mscp binary.
+If $MSCP_BIN_PATH is not set, use mscp in default $PATH.
+"""
+
+if "MSCP_BIN_PATH" in os.environ:
+ mscp = os.environ["MSCP_BIN_PATH"]
+else:
+ mscp = "mscp"
+
+
+
+
+""" usage test """
+def run2ok(args):
+ check_call(list(map(str, args)))
+
+def run2ng(args):
+ with pytest.raises(CalledProcessError) as e:
+ check_call(list(map(str, args)))
+
+def test_usage():
+ run2ng([mscp])
+ run2ok([mscp, "-h"])
+
+def test_invalid_chunk_size_config():
+ run2ng([mscp, "-s", 8 << 20, "-S", 4 << 20])
+
+param_invalid_hostnames = [
+ (["a:a", "b:b", "c:c"]), (["a:a", "b:b", "c"]), (["a:a", "b", "c:c"]),
+ (["a", "b:b", "c:c"])
+]
+@pytest.mark.parametrize("args", param_invalid_hostnames)
+def test_nonidentical_hostnames(args):
+ run2ng([mscp] + args)
+
+
+
+
+""" copy test """
+
+remote_prefix = "localhost:{}/".format(os.getcwd()) # use current dir
+
+param_single_copy = [
+ (File("test1", size = 64), File("test2")),
+ (File("test1", size = 4096 * 1), File("test2")),
+ (File("test1", size = 128 * 1024 * 1024), File("test2")),
+]
+
+@pytest.mark.parametrize("src, dst", param_single_copy)
+def test_single_copy_remote2local(src, dst):
+ src.make()
+ run2ok([mscp, remote_prefix + src.path, dst.path])
+ assert check_same_md5sum(src, dst)
+ src.cleanup()
+ dst.cleanup()
+
+@pytest.mark.parametrize("src, dst", param_single_copy)
+def test_single_copy_local2remote(src, dst):
+ src.make()
+ run2ok([mscp, src.path, remote_prefix + dst.path])
+ assert check_same_md5sum(src, dst)
+ src.cleanup()
+ dst.cleanup()
+
+
+
+param_dir_copy = [
+ ( "src_dir", "dst_dir",
+ [ File("src_dir/t1", size = 64),
+ File("src_dir/t2", size = 4096),
+ File("src_dir/d1/t3", size = 64),
+ File("src_dir/d1/d2/t4", size = 128), ],
+ [ File("dst_dir/t1"),
+ File("dst_dir/t2"),
+ File("dst_dir/d1/t3"),
+ File("dst_dir/d1/d2/t4"), ],
+ [ File("dst_dir/src_dir/t1"),
+ File("dst_dir/src_dir/t2"),
+ File("dst_dir/src_dir/d1/t3"),
+ File("dst_dir/src_dir/d1/d2/t4"), ],
+ )
+]
+
+"""
+`scp remote:src_dir dst_dir` renames src_dir to dst_dir if dst_dir
+does not exist. If dst_dir exists, scp copies src_dir to
+dst_dir/src_dir. So, this test checks both cases.
+"""
+
+@pytest.mark.parametrize("src_dir, dst_dir, src, dst, twice", param_dir_copy)
+def test_dir_copy_remote2local(src_dir, dst_dir, src, dst, twice):
+ for f in src:
+ f.make()
+
+ run2ok([mscp, remote_prefix + src_dir, dst_dir])
+ for sf, df in zip(src, dst):
+ assert check_same_md5sum(sf, df)
+
+ run2ok([mscp, remote_prefix + src_dir, dst_dir])
+ for sf, df in zip(src, twice):
+ assert check_same_md5sum(sf, df)
+
+ for sf, df, tf in zip(src, dst, twice):
+ sf.cleanup()
+ df.cleanup()
+ tf.cleanup()
+
+@pytest.mark.parametrize("src_dir, dst_dir, src, dst, twice", param_dir_copy)
+def test_dir_copy_local2remote(src_dir, dst_dir, src, dst, twice):
+ for f in src:
+ f.make()
+
+ run2ok([mscp, src_dir, remote_prefix + dst_dir])
+ for sf, df in zip(src, dst):
+ assert check_same_md5sum(sf, df)
+
+ run2ok([mscp, src_dir, remote_prefix + dst_dir])
+ for sf, df in zip(src, twice):
+ assert check_same_md5sum(sf, df)
+
+ for sf, df, tf in zip(src, dst, twice):
+ sf.cleanup()
+ df.cleanup()
+ tf.cleanup()
+
+
+param_remote_prefix = [
+ ("", remote_prefix), (remote_prefix, "")
+]
+@pytest.mark.parametrize("src_prefix, dst_prefix", param_remote_prefix)
+def test_override_single_file(src_prefix, dst_prefix):
+ src = File("src", size = 128).make()
+ dst = File("dst", size = 128).make()
+ assert not check_same_md5sum(src, dst)
+
+ run2ok([mscp, src_prefix + src.path, dst_prefix + dst.path])
+ assert check_same_md5sum(src, dst)
+
+ src.cleanup()
+ dst.cleanup()
+
+@pytest.mark.parametrize("src_prefix, dst_prefix", param_remote_prefix)
+def test_min_chunk(src_prefix, dst_prefix):
+ src = File("src", size = 16 * 1024).make()
+ dst = File("dst")
+
+ run2ok([mscp, "-s", 8192, src_prefix + src.path, dst_prefix + dst.path])
+ assert check_same_md5sum(src, dst)
+
+ src.cleanup()
+ dst.cleanup()