Merge authors:
  James Hunt (jamesodhunt)
Related merge proposals:
  
https://code.launchpad.net/~jamesodhunt/upstart/environ-remove-tests/+merge/192506
  proposed by: James Hunt (jamesodhunt)
  review: Approve - Dmitrijs Ledkovs (xnox)
------------------------------------------------------------
revno: 1551 [merge]
committer: Dmitrijs Ledkovs <[email protected]>
branch nick: upstart
timestamp: Sun 2013-11-03 00:43:16 +0000
message:
  merge lp:~jamesodhunt/upstart/environ-remove-tests
modified:
  ChangeLog
  init/environ.c
  init/job_process.c
  init/tests/test_environ.c
  test/test_util_common.c


--
lp:upstart
https://code.launchpad.net/~upstart-devel/upstart/trunk

Your team Upstart Reviewers is subscribed to branch lp:upstart.
To unsubscribe from this branch go to 
https://code.launchpad.net/~upstart-devel/upstart/trunk/+edit-subscription
=== modified file 'ChangeLog'
--- ChangeLog	2013-11-03 00:28:07 +0000
+++ ChangeLog	2013-11-03 00:43:16 +0000
@@ -32,6 +32,24 @@
 	* scripts/tests/test_pyupstart_session_init.py: Added file bridge tests
 	  for directory creation, modification and deletion.
 
+2013-10-24  James Hunt  <[email protected]>
+
+	* init/environ.c: Comment.
+	* init/job_process.c: Formatting.
+	* init/test_environ.c:
+	  - test_add(): New test:
+	    - "using bare word with no corresponding variable set in environment"
+	  - test_remove(): New function ("the missing test") containing 8 new tests:
+	    - "remove name=value pair with empty table"
+	    - "remove bare name with empty table"
+	    - "remove name=value from table of size 1"
+	    - "remove bare name from table of size 1"
+	    - "remove first name=value entry from table of size 2"
+	    - "remove first bare name entry from table of size 2"
+	    - "remove last name=value entry from table of size 2"
+	    - "remove last bare name entry from table of size 2"
+	* test/test_util_common.c: get_initctl(): Added environment checks.
+
 2013-10-23  Dmitrijs Ledkovs  <[email protected]>
 
  	* extra/upstart-socket-bridge.c: use SOCKET_PATH in our event

=== modified file 'init/environ.c'
--- init/environ.c	2013-01-08 15:57:31 +0000
+++ init/environ.c	2013-10-24 13:33:05 +0000
@@ -202,6 +202,10 @@
 	for (e = *env; e && *e; e++) {
 		keylen = strcspn (*e, "=");
 
+		/* Found @str in the existing environment (either as a
+		 * name=value pair, or a bare name), so don't copy it to
+		 * the new environment.
+		 */
 		if (! strncmp (str, *e, keylen))
 			continue;
 

=== modified file 'init/job_process.c'
--- init/job_process.c	2013-10-03 14:43:24 +0000
+++ init/job_process.c	2013-10-24 13:33:05 +0000
@@ -278,7 +278,7 @@
 	env = NIH_MUST (nih_str_array_new (NULL));
 
 	if (job->env)
-		NIH_MUST(environ_append (&env, NULL, &envc, TRUE, job->env));
+		NIH_MUST (environ_append (&env, NULL, &envc, TRUE, job->env));
 
 	if (job->stop_env
 	    && ((process == PROCESS_PRE_STOP)

=== modified file 'init/tests/test_environ.c'
--- init/tests/test_environ.c	2011-06-06 17:05:11 +0000
+++ init/tests/test_environ.c	2013-10-24 13:33:05 +0000
@@ -572,6 +572,462 @@
 	}
 
 	unsetenv ("BAR");
+
+	/* Check that attempting to add a variable by name fails if
+	 * there is no corresponding environment variable set.
+	 */
+	TEST_FEATURE ("using bare word with no corresponding variable set in environment");
+
+	/* Ensure variable not set initially */
+	TEST_EQ_P (getenv ("UPSTART_TEST_VARIABLE"), NULL);
+
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+			assert (nih_str_array_add (&env, NULL, &len,
+						   "FOO=BAR"));
+		}
+
+		ret = environ_add (&env, NULL, &len, FALSE, "UPSTART_TEST_VARIABLE");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		/* XXX: Attempting to add an unset variable results in
+		 * no change to the table (it is not an error!)
+		 */
+		TEST_EQ_P (ret, env);
+
+		TEST_EQ (len, 1);
+		TEST_EQ_STR (env[0], "FOO=BAR");
+		TEST_EQ_P (env[1], NULL);
+
+		nih_free (env);
+	}
+}
+
+void
+test_remove (void)
+{
+	char   **env = NULL, **ret;
+	size_t   len = 0;
+
+	TEST_FUNCTION ("environ_remove");
+
+	TEST_FEATURE ("remove name=value pair with empty table");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+		}
+
+		ret = environ_remove (&env, NULL, &len, "FOO=BAR");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 0);
+			TEST_EQ_P (env[0], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_EQ_P (ret, NULL);
+		TEST_EQ (len, 0);
+		TEST_EQ_P (env[0], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove bare name with empty table");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+		}
+
+		ret = environ_remove (&env, NULL, &len, "FOO");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 0);
+			TEST_EQ_P (env[0], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_EQ_P (ret, NULL);
+		TEST_EQ (len, 0);
+		TEST_EQ_P (env[0], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove name=value from table of size 1");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "FOO=BAR");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+		}
+
+		ret = environ_remove (&env, NULL, &len, "FOO=BAR");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+
+			TEST_NE_P (env[0], NULL);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_EQ_P (env[1], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 0);
+		TEST_EQ_P (env[0], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove bare name from table of size 1");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "FOO=BAR");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+		}
+
+		ret = environ_remove (&env, NULL, &len, "FOO");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+
+			TEST_NE_P (env[0], NULL);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_EQ_P (env[1], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 0);
+		TEST_EQ_P (env[0], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove first name=value entry from table of size 2");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "FOO=BAR");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "BAZ=QUX");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+		}
+
+		/* Remove first entry added */
+		ret = environ_remove (&env, NULL, &len, "FOO=BAR");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 1);
+
+		TEST_ALLOC_PARENT (env[0], env);
+		TEST_ALLOC_SIZE (env[0], 8);
+		TEST_EQ_STR (env[0], "BAZ=QUX");
+
+		TEST_EQ_P (env[1], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove first bare name entry from table of size 2");
+
+	/* Set a variable to allow the bare name to be expanded */
+	assert0 (setenv ("UPSTART_TEST_VARIABLE", "foo", 1));
+
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "UPSTART_TEST_VARIABLE");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+
+			/* Should have been expanded */
+			TEST_EQ_STR (env[0], "UPSTART_TEST_VARIABLE=foo");
+
+			TEST_EQ_P (env[1], NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "BAZ=QUX");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "UPSTART_TEST_VARIABLE=foo");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+		}
+
+		/* Remove first entry added */
+		ret = environ_remove (&env, NULL, &len, "UPSTART_TEST_VARIABLE");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "UPSTART_TEST_VARIABLE=foo");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 1);
+
+		TEST_ALLOC_PARENT (env[0], env);
+		TEST_ALLOC_SIZE (env[0], 8);
+		TEST_EQ_STR (env[0], "BAZ=QUX");
+
+		TEST_EQ_P (env[1], NULL);
+
+		nih_free (env);
+	}
+
+	assert0 (unsetenv ("UPSTART_TEST_VARIABLE"));
+
+	TEST_FEATURE ("remove last name=value entry from table of size 2");
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "FOO=BAR");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "BAZ=QUX");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+		}
+
+		/* Remove last entry added */
+		ret = environ_remove (&env, NULL, &len, "BAZ=QUX");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "BAZ=QUX");
+
+			TEST_EQ_P (env[2], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 1);
+
+		TEST_ALLOC_PARENT (env[0], env);
+		TEST_ALLOC_SIZE (env[0], 8);
+		TEST_EQ_STR (env[0], "FOO=BAR");
+
+		TEST_EQ_P (env[1], NULL);
+
+		nih_free (env);
+	}
+
+	TEST_FEATURE ("remove last bare name entry from table of size 2");
+
+	/* Set a variable to allow the bare name to be expanded */
+	assert0 (setenv ("UPSTART_TEST_VARIABLE", "foo", 1));
+
+	TEST_ALLOC_FAIL {
+		TEST_ALLOC_SAFE {
+			len = 0;
+			env = nih_str_array_new (NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "FOO=BAR");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 1);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+			TEST_EQ_P (env[1], NULL);
+
+			ret = environ_add (&env, NULL, &len, TRUE, "UPSTART_TEST_VARIABLE");
+			TEST_NE_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+
+			/* Should have been expanded */
+			TEST_EQ_STR (env[1], "UPSTART_TEST_VARIABLE=foo");
+
+			TEST_EQ_P (env[2], NULL);
+		}
+
+		/* Remove last entry added */
+		ret = environ_remove (&env, NULL, &len, "UPSTART_TEST_VARIABLE");
+
+		if (test_alloc_failed) {
+			TEST_EQ_P (ret, NULL);
+
+			TEST_EQ (len, 2);
+			TEST_ALLOC_PARENT (env[0], env);
+			TEST_ALLOC_SIZE (env[0], 8);
+			TEST_EQ_STR (env[0], "FOO=BAR");
+
+			TEST_ALLOC_PARENT (env[1], env);
+			TEST_ALLOC_SIZE (env[1], 8);
+			TEST_EQ_STR (env[1], "UPSTART_TEST_VARIABLE=foo");
+
+			TEST_EQ_P (env[2], NULL);
+
+			nih_free (env);
+			continue;
+		}
+
+		TEST_NE_P (ret, NULL);
+		TEST_EQ (len, 1);
+
+		TEST_ALLOC_PARENT (env[0], env);
+		TEST_ALLOC_SIZE (env[0], 8);
+		TEST_EQ_STR (env[0], "FOO=BAR");
+
+		TEST_EQ_P (env[1], NULL);
+
+		nih_free (env);
+	}
+
+	assert0 (unsetenv ("UPSTART_TEST_VARIABLE"));
 }
 
 void
@@ -1590,6 +2046,7 @@
 	setenv ("UPSTART_NO_SESSIONS", "1", 1);
 
 	test_add ();
+	test_remove ();
 	test_append ();
 	test_set ();
 	test_lookup ();

=== modified file 'test/test_util_common.c'
--- test/test_util_common.c	2013-10-02 08:59:20 +0000
+++ test/test_util_common.c	2013-10-24 13:33:05 +0000
@@ -349,6 +349,16 @@
 {
 	static char path[PATH_MAX + 1024] = { 0 };
 	int         ret;
+	int         env_valid;
+
+	/* Sanity check calling environment */
+	if (test_user_mode) {
+		env_valid = getenv ("UPSTART_SESSION") ? TRUE : FALSE;
+	} else {
+		env_valid = getenv ("DBUS_SESSION_BUS_ADDRESS") ? TRUE : FALSE;
+	}
+
+	nih_assert (env_valid);
 
 	ret = sprintf (path, "%s %s",
 			get_initctl_binary (),

-- 
upstart-devel mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to