Browse Source

Add test for gamemoderun and the reaper thread

	Using a simple test allows us to check both at once
Marc Di Luzio 6 years ago
parent
commit
94b6a34f65
1 changed files with 69 additions and 8 deletions
  1. 69 8
      daemon/gamemode-tests.c

+ 69 - 8
daemon/gamemode-tests.c

@@ -242,6 +242,61 @@ static int run_dual_client_tests(void)
 	return status;
 }
 
+/* Check gamemoderun works */
+static int run_gamemoderun_and_reaper_tests(struct GameModeConfig *config)
+{
+	int status = 0;
+
+	LOG_MSG(":: Gamemoderun and reaper thread tests\n");
+
+	/* Fork so that the child can request gamemode */
+	int child = fork();
+	if (child == 0) {
+		/* Close stdout, we don't care if sh prints anything */
+		fclose(stdout);
+		/* Preload into sh and then kill it */
+		if (execl("/usr/bin/gamemoderun", "/usr/bin/gamemoderun", "sh", (char *)NULL) == -1) {
+			LOG_ERROR("failed to launch gamemoderun with execl: %s\n", strerror(errno));
+			return -1;
+		}
+	}
+
+	/* Give the child a chance to reqeust gamemode */
+	usleep(10000);
+
+	/* Check that when we request gamemode, it replies that the other client is connected */
+	if (verify_other_client_connected() != 0)
+		status = -1;
+
+	/* Send SIGTERM to the child to stop it*/
+	if (kill(child, SIGTERM) == -1) {
+		LOG_ERROR("failed to send continue signal to other client: %s\n", strerror(errno));
+		status = -1;
+	}
+
+	/* Wait for the child to clean up */
+	int wstatus;
+	while (waitpid(child, &wstatus, WNOHANG) == 0) {
+		LOG_MSG("...Waiting for child to quit...\n");
+		usleep(100000);
+	}
+
+	/* And give gamemode a chance to reap the process */
+	long freq = config_get_reaper_frequency(config);
+	LOG_MSG("...Waiting for reaper thread (reaper_frequency set to %ld seconds)...\n", freq);
+	sleep((unsigned int)freq);
+
+	/* Verify that gamemode is now innactive */
+	if (verify_deactivated() != 0)
+		return -1;
+
+	if (status == 0)
+		LOG_MSG(":: Passed\n\n");
+
+	return status;
+}
+
+/* Check the cpu governor setting works */
 static int run_cpu_governor_tests(struct GameModeConfig *config)
 {
 	/* get the two config parameters we care about */
@@ -450,19 +505,13 @@ int run_gpu_optimisation_tests(struct GameModeConfig *config)
  * game_mode_run_feature_tests runs a set of tests for each current feature (based on the current
  * config) returns 0 for success, -1 for failure
  */
-static int game_mode_run_feature_tests(void)
+static int game_mode_run_feature_tests(struct GameModeConfig *config)
 {
 	int status = 0;
 	LOG_MSG(":: Feature tests\n");
 
 	/* If we reach here, we should assume the basic requests and register functions are working */
 
-	/* Grab the config */
-	/* Note: this config may pick up a local gamemode.ini, or the daemon may have one, we may need
-	 * to cope with that */
-	GameModeConfig *config = config_create();
-	config_init(config);
-
 	/* Does the CPU governor get set properly? */
 	{
 		LOG_MSG("::: Verifying CPU governor setting\n");
@@ -536,6 +585,14 @@ static int game_mode_run_feature_tests(void)
 int game_mode_run_client_tests()
 {
 	int status = 0;
+
+	LOG_MSG(": Loading config\n");
+	/* Grab the config */
+	/* Note: this config may pick up a local gamemode.ini, or the daemon may have one, we may need
+	 * to cope with that */
+	GameModeConfig *config = config_create();
+	config_init(config);
+
 	LOG_MSG(": Running tests\n\n");
 
 	/* Run the basic tests */
@@ -546,11 +603,15 @@ int game_mode_run_client_tests()
 	if (run_dual_client_tests() != 0)
 		status = -1;
 
+	/* Check gamemoderun and the reaper thread work */
+	if (run_gamemoderun_and_reaper_tests(config) != 0)
+		status = -1;
+
 	if (status != 0) {
 		LOG_MSG(": Client tests failed, skipping feature tests\n");
 	} else {
 		/* Run the feature tests */
-		status = game_mode_run_feature_tests();
+		status = game_mode_run_feature_tests(config);
 	}
 
 	if (status >= 0)