James Hunt has proposed merging lp:~jamesodhunt/upstart/environ-remove-tests into lp:upstart.
Requested reviews: Upstart Reviewers (upstart-reviewers) For more details, see: https://code.launchpad.net/~jamesodhunt/upstart/environ-remove-tests/+merge/192506 -- https://code.launchpad.net/~jamesodhunt/upstart/environ-remove-tests/+merge/192506 Your team Upstart Reviewers is requested to review the proposed merge of lp:~jamesodhunt/upstart/environ-remove-tests into lp:upstart.
=== modified file 'ChangeLog' --- ChangeLog 2013-10-23 22:44:54 +0000 +++ ChangeLog 2013-10-24 13:34:13 +0000 @@ -1,3 +1,21 @@ +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:34:13 +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:34:13 +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:34:13 +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:34:13 +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
