From 20245fb4419afb3304ae7770f97e0225835fcfde Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ma=C3=ABl=20Madon?= <mael.madon@irit.fr>
Date: Wed, 16 Nov 2022 13:55:12 +0100
Subject: [PATCH] test: add a test to check that the simulation outputs in
 'replay with feedback' mode are 'very close' to the simulation outputs in
 'replay rigid' mode, in case of an oversized platform file

---
 test/test_fb_users.py | 52 +++++++++++++++++++++++++++++++++----------
 1 file changed, 40 insertions(+), 12 deletions(-)

diff --git a/test/test_fb_users.py b/test/test_fb_users.py
index fa3c0d8..25a2ed8 100644
--- a/test/test_fb_users.py
+++ b/test/test_fb_users.py
@@ -95,18 +95,51 @@ def test_tt_only_simple_workload():
     launch_fb_test_1user(user_category='fb_user_think_time_only',
                    test_input='proto_SABjson_v2')
 
+def assert_simu_output_are_close_enough(out_dir1, out_dir2):
+    """Returns true if the jobs.csv in both directories are epsilon-close (for 
+    the normalized euclidean distance) for each of the fields submission time, 
+    start time and finish time."""
+    epsilon = 1e-6 # precision of 0.0001%
+
+    dis = distances(f"{out_dir1}/_jobs.csv", f"{out_dir2}/_jobs.csv", 
+                    euclidean=False, norm_eucl=True,
+                    field=["submission_time", "starting_time", "finish_time"])
+    assert dis["submission_time"]["normalized_euclidean"] < epsilon
+    assert dis["starting_time"]["normalized_euclidean"] < epsilon
+    assert dis["finish_time"]["normalized_euclidean"] < epsilon
+
+
 def test_tt_only_multiuser():
-    """4 users generated from the 10 first days of metacentrum log."""
+    """Workload: 4 users taken from the 10 first days of metacentrum log.
+    This tests checks:
+    - that the simulation with feedback doesn't fail for multiuser instances
+    - that the simulation outputs are "very close" to the rigid replay, no 
+      matter the delimitation approach, because the platform is oversized.
+    To test the "closeness" we make use of custom distances (see batmen-tools).
+    """
     names = ["user5", "user9", "user10", "user11"]
-    category = "fb_user_think_time_only"
     
+    # Launch a simulation with replay rigid, for comparison
+    category = "replay_user_rigid"
+    test_name = "mc_10days"
+    jsons = [f"test/workloads/split_by_user/{user}.json" for user in names]
+    make_fb_user_description_file(
+        user_name=names, user_category=[category]*4, input_json=jsons)
+    rigid_dir = run_user(category, mc_europar_platform, empty_workload, 
+                         test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+
+
+    # Launch feedback users on the same original log, and compare with rigid
+    category = "fb_user_think_time_only"
+
     # mc_10_days_a60
     test_name = "mc_10days_a60"
     jsons = [f"test/workloads/SABjson/{test_name}/{user}.SABjson" for user in names]
     make_fb_user_description_file(
         user_name=names, user_category=[category]*4, input_json=jsons)
-    run_user(category, mc_europar_platform, empty_workload, 
-             test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+    feedback_dir = run_user(category, mc_europar_platform, empty_workload, 
+                            test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+    assert_simu_output_are_close_enough(feedback_dir, rigid_dir)
 
     # mc_10_days_l60
     test_name = "mc_10days_l60"
@@ -115,6 +148,7 @@ def test_tt_only_multiuser():
         user_name=names, user_category=[category]*4, input_json=jsons)
     run_user(category, mc_europar_platform, empty_workload, 
              test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+    assert_simu_output_are_close_enough(feedback_dir, rigid_dir)
 
 
     # mc_10_days_m60
@@ -124,13 +158,7 @@ def test_tt_only_multiuser():
         user_name=names, user_category=[category]*4, input_json=jsons)
     run_user(category, mc_europar_platform, empty_workload, 
              test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+    assert_simu_output_are_close_enough(feedback_dir, rigid_dir)
 
 
-    # Replay rigid, for comparison
-    category = "replay_user_rigid"
-    test_name = "mc_10days"
-    jsons = [f"test/workloads/split_by_user/{user}.json" for user in names]
-    make_fb_user_description_file(
-        user_name=names, user_category=[category]*4, input_json=jsons)
-    run_user(category, mc_europar_platform, empty_workload, 
-             test_name=f'{category}-{test_name}', schedconf=schedconf_file)
+    
-- 
GitLab