Merge pull request #10536 from keszybz/serialize-fixes
Tests for the new serialization functions
This commit is contained in:
commit
0d76d772d1
|
@ -1221,6 +1221,24 @@ int mkostemp_safe(char *pattern) {
|
|||
return fd;
|
||||
}
|
||||
|
||||
int fmkostemp_safe(char *pattern, const char *mode, FILE **ret_f) {
|
||||
int fd;
|
||||
FILE *f;
|
||||
|
||||
fd = mkostemp_safe(pattern);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
f = fdopen(fd, mode);
|
||||
if (!f) {
|
||||
safe_close(fd);
|
||||
return -errno;
|
||||
}
|
||||
|
||||
*ret_f = f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tempfn_xxxxxx(const char *p, const char *extra, char **ret) {
|
||||
const char *fn;
|
||||
char *t;
|
||||
|
|
|
@ -64,6 +64,7 @@ int fflush_sync_and_check(FILE *f);
|
|||
|
||||
int fopen_temporary(const char *path, FILE **_f, char **_temp_path);
|
||||
int mkostemp_safe(char *pattern);
|
||||
int fmkostemp_safe(char *pattern, const char *mode, FILE**_f);
|
||||
|
||||
int tempfn_xxxxxx(const char *p, const char *extra, char **ret);
|
||||
int tempfn_random(const char *p, const char *extra, char **ret);
|
||||
|
|
|
@ -113,7 +113,7 @@ int serialize_strv(FILE *f, const char *key, char **l) {
|
|||
int ret = 0, r;
|
||||
char **i;
|
||||
|
||||
/* Returns the first error */
|
||||
/* Returns the first error, or positive if anything was serialized, 0 otherwise. */
|
||||
|
||||
STRV_FOREACH(i, l) {
|
||||
r = serialize_item_escaped(f, key, *i);
|
||||
|
|
|
@ -148,6 +148,10 @@ tests += [
|
|||
libmount,
|
||||
libblkid]],
|
||||
|
||||
[['src/test/test-serialize.c'],
|
||||
[],
|
||||
[]],
|
||||
|
||||
[['src/test/test-utf8.c'],
|
||||
[],
|
||||
[]],
|
||||
|
|
|
@ -9,12 +9,12 @@
|
|||
#include "clock-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "fs-util.h"
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
|
||||
static void test_clock_is_localtime(void) {
|
||||
char adjtime[] = "/tmp/test-adjtime.XXXXXX";
|
||||
int fd = -1;
|
||||
_cleanup_(unlink_tempfilep) char adjtime[] = "/tmp/test-adjtime.XXXXXX";
|
||||
_cleanup_fclose_ FILE* f = NULL;
|
||||
|
||||
static const struct scenario {
|
||||
|
@ -41,22 +41,17 @@ static void test_clock_is_localtime(void) {
|
|||
/* without an adjtime file we default to UTC */
|
||||
assert_se(clock_is_localtime("/nonexisting/adjtime") == 0);
|
||||
|
||||
fd = mkostemp_safe(adjtime);
|
||||
assert_se(fd >= 0);
|
||||
assert_se(fmkostemp_safe(adjtime, "w", &f) == 0);
|
||||
log_info("adjtime test file: %s", adjtime);
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
for (size_t i = 0; i < ELEMENTSOF(scenarios); ++i) {
|
||||
log_info("scenario #%zu:, expected result %i", i, scenarios[i].expected_result);
|
||||
log_info("%s", scenarios[i].contents);
|
||||
rewind(f);
|
||||
ftruncate(fd, 0);
|
||||
ftruncate(fileno(f), 0);
|
||||
assert_se(write_string_stream(f, scenarios[i].contents, WRITE_STRING_FILE_AVOID_NEWLINE) == 0);
|
||||
assert_se(clock_is_localtime(adjtime) == scenarios[i].expected_result);
|
||||
}
|
||||
|
||||
unlink(adjtime);
|
||||
}
|
||||
|
||||
/* Test with the real /etc/adjtime */
|
||||
|
|
|
@ -311,9 +311,9 @@ static const char* const config_file[] = {
|
|||
|
||||
static void test_config_parse(unsigned i, const char *s) {
|
||||
_cleanup_(unlink_tempfilep) char name[] = "/tmp/test-conf-parser.XXXXXX";
|
||||
int fd, r;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
_cleanup_free_ char *setting1 = NULL;
|
||||
int r;
|
||||
|
||||
const ConfigTableItem items[] = {
|
||||
{ "Section", "setting1", config_parse_string, 0, &setting1},
|
||||
|
@ -322,12 +322,9 @@ static void test_config_parse(unsigned i, const char *s) {
|
|||
|
||||
log_info("== %s[%i] ==", __func__, i);
|
||||
|
||||
fd = mkostemp_safe(name);
|
||||
assert_se(fd >= 0);
|
||||
assert_se((size_t) write(fd, s, strlen(s)) == strlen(s));
|
||||
|
||||
assert_se(lseek(fd, 0, SEEK_SET) == 0);
|
||||
assert_se(f = fdopen(fd, "r"));
|
||||
assert_se(fmkostemp_safe(name, "r+", &f) == 0);
|
||||
assert_se(fwrite(s, strlen(s), 1, f) == 1);
|
||||
rewind(f);
|
||||
|
||||
/*
|
||||
int config_parse(const char *unit,
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "env-util.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "fs-util.h"
|
||||
#include "serialize.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
|
@ -305,68 +306,6 @@ static void test_env_assignment_is_valid(void) {
|
|||
assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;<mock-chroot>\x07<mock-chroot>\""));
|
||||
}
|
||||
|
||||
static void test_deserialize_environment(void) {
|
||||
_cleanup_strv_free_ char **env;
|
||||
|
||||
assert_se(env = strv_new("A=1", NULL));
|
||||
|
||||
assert_se(deserialize_environment("B=2", &env) >= 0);
|
||||
assert_se(deserialize_environment("FOO%%=a\\177b\\nc\\td e", &env) >= 0);
|
||||
|
||||
assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2", "FOO%%=a\177b\nc\td e")));
|
||||
|
||||
assert_se(deserialize_environment("foo\\", &env) < 0);
|
||||
assert_se(deserialize_environment("bar\\_baz", &env) < 0);
|
||||
}
|
||||
|
||||
static void test_serialize_environment(void) {
|
||||
_cleanup_strv_free_ char **env = NULL, **env2 = NULL;
|
||||
char fn[] = "/tmp/test-env-util.XXXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
int fd, r;
|
||||
|
||||
|
||||
assert_se(env = strv_new("A=1",
|
||||
"B=2",
|
||||
"C=ąęółń",
|
||||
"D=D=a\\x0Ab",
|
||||
"FOO%%=a\177b\nc\td e",
|
||||
NULL));
|
||||
|
||||
fd = mkostemp_safe(fn);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
assert_se(f = fdopen(fd, "r+"));
|
||||
|
||||
assert_se(serialize_strv(f, "env", env) > 0);
|
||||
assert_se(fflush_and_check(f) == 0);
|
||||
|
||||
rewind(f);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *line = NULL;
|
||||
const char *l;
|
||||
|
||||
r = read_line(f, LONG_LINE_MAX, &line);
|
||||
assert_se(r >= 0);
|
||||
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
l = strstrip(line);
|
||||
|
||||
assert_se(startswith(l, "env="));
|
||||
|
||||
r = deserialize_environment(l+4, &env2);
|
||||
assert_se(r >= 0);
|
||||
}
|
||||
assert_se(feof(f));
|
||||
|
||||
assert_se(strv_equal(env, env2));
|
||||
|
||||
unlink(fn);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_strv_env_delete();
|
||||
test_strv_env_get();
|
||||
|
@ -383,8 +322,6 @@ int main(int argc, char *argv[]) {
|
|||
test_env_name_is_valid();
|
||||
test_env_value_is_valid();
|
||||
test_env_assignment_is_valid();
|
||||
test_deserialize_environment();
|
||||
test_serialize_environment();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -23,24 +23,15 @@ static void test_parse_env_file(void) {
|
|||
_cleanup_(unlink_tempfilep) char
|
||||
t[] = "/tmp/test-fileio-in-XXXXXX",
|
||||
p[] = "/tmp/test-fileio-out-XXXXXX";
|
||||
int fd, r;
|
||||
FILE *f;
|
||||
_cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
|
||||
*six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL;
|
||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
||||
char **i;
|
||||
unsigned k;
|
||||
int r;
|
||||
|
||||
fd = mkostemp_safe(p);
|
||||
assert_se(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
assert_se(fmkostemp_safe(t, "w", &f) == 0);
|
||||
fputs("one=BAR \n"
|
||||
"# comment\n"
|
||||
" # comment \n"
|
||||
|
@ -128,6 +119,12 @@ static void test_parse_env_file(void) {
|
|||
assert_se(streq(nine, "nineval"));
|
||||
assert_se(ten == NULL);
|
||||
|
||||
{
|
||||
/* prepare a temporary file to write the environment to */
|
||||
_cleanup_close_ int fd = mkostemp_safe(p);
|
||||
assert_se(fd >= 0);
|
||||
}
|
||||
|
||||
r = write_env_file(p, a);
|
||||
assert_se(r >= 0);
|
||||
|
||||
|
@ -139,21 +136,12 @@ static void test_parse_multiline_env_file(void) {
|
|||
_cleanup_(unlink_tempfilep) char
|
||||
t[] = "/tmp/test-fileio-in-XXXXXX",
|
||||
p[] = "/tmp/test-fileio-out-XXXXXX";
|
||||
int fd, r;
|
||||
FILE *f;
|
||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
||||
char **i;
|
||||
int r;
|
||||
|
||||
fd = mkostemp_safe(p);
|
||||
assert_se(fd >= 0);
|
||||
close(fd);
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
assert_se(fmkostemp_safe(t, "w", &f) == 0);
|
||||
fputs("one=BAR\\\n"
|
||||
" VAR\\\n"
|
||||
"\tGAR\n"
|
||||
|
@ -180,6 +168,11 @@ static void test_parse_multiline_env_file(void) {
|
|||
assert_se(streq_ptr(a[2], "tri=bar var \tgar "));
|
||||
assert_se(a[3] == NULL);
|
||||
|
||||
{
|
||||
_cleanup_close_ int fd = mkostemp_safe(p);
|
||||
assert_se(fd >= 0);
|
||||
}
|
||||
|
||||
r = write_env_file(p, a);
|
||||
assert_se(r >= 0);
|
||||
|
||||
|
@ -189,19 +182,14 @@ static void test_parse_multiline_env_file(void) {
|
|||
|
||||
static void test_merge_env_file(void) {
|
||||
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
|
||||
int fd, r;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
char **i;
|
||||
int r;
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
assert_se(fmkostemp_safe(t, "w", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, t);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
r = write_string_stream(f,
|
||||
"one=1 \n"
|
||||
"twelve=${one}2\n"
|
||||
|
@ -258,19 +246,14 @@ static void test_merge_env_file(void) {
|
|||
|
||||
static void test_merge_env_file_invalid(void) {
|
||||
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
|
||||
int fd, r;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
char **i;
|
||||
int r;
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
assert_se(fmkostemp_safe(t, "w", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, t);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
r = write_string_stream(f,
|
||||
"unset one \n"
|
||||
"unset one= \n"
|
||||
|
@ -297,16 +280,11 @@ static void test_merge_env_file_invalid(void) {
|
|||
|
||||
static void test_executable_is_script(void) {
|
||||
_cleanup_(unlink_tempfilep) char t[] = "/tmp/test-fileio-XXXXXX";
|
||||
int fd, r;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
char *command;
|
||||
int r;
|
||||
|
||||
fd = mkostemp_safe(t);
|
||||
assert_se(fd >= 0);
|
||||
|
||||
f = fdopen(fd, "w");
|
||||
assert_se(f);
|
||||
|
||||
assert_se(fmkostemp_safe(t, "w", &f) == 0);
|
||||
fputs("#! /bin/script -a -b \ngoo goo", f);
|
||||
fflush(f);
|
||||
|
||||
|
|
|
@ -0,0 +1,209 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "def.h"
|
||||
#include "escape.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "fs-util.h"
|
||||
#include "log.h"
|
||||
#include "serialize.h"
|
||||
#include "strv.h"
|
||||
#include "tests.h"
|
||||
|
||||
char long_string[LONG_LINE_MAX+1];
|
||||
|
||||
static void test_serialize_item(void) {
|
||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
|
||||
assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, fn);
|
||||
|
||||
assert_se(serialize_item(f, "a", NULL) == 0);
|
||||
assert_se(serialize_item(f, "a", "bbb") == 1);
|
||||
assert_se(serialize_item(f, "a", "bbb") == 1);
|
||||
assert_se(serialize_item(f, "a", long_string) == -EINVAL);
|
||||
assert_se(serialize_item(f, long_string, "a") == -EINVAL);
|
||||
assert_se(serialize_item(f, long_string, long_string) == -EINVAL);
|
||||
|
||||
rewind(f);
|
||||
|
||||
_cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
|
||||
assert_se(streq(line1, "a=bbb"));
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
|
||||
assert_se(streq(line2, "a=bbb"));
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
|
||||
assert_se(streq(line3, ""));
|
||||
}
|
||||
|
||||
static void test_serialize_item_escaped(void) {
|
||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
|
||||
assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, fn);
|
||||
|
||||
assert_se(serialize_item_escaped(f, "a", NULL) == 0);
|
||||
assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
|
||||
assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
|
||||
assert_se(serialize_item_escaped(f, "a", long_string) == -EINVAL);
|
||||
assert_se(serialize_item_escaped(f, long_string, "a") == -EINVAL);
|
||||
assert_se(serialize_item_escaped(f, long_string, long_string) == -EINVAL);
|
||||
|
||||
rewind(f);
|
||||
|
||||
_cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
|
||||
assert_se(streq(line1, "a=bbb"));
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
|
||||
assert_se(streq(line2, "a=bbb"));
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
|
||||
assert_se(streq(line3, ""));
|
||||
}
|
||||
|
||||
static void test_serialize_usec(void) {
|
||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
|
||||
assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, fn);
|
||||
|
||||
assert_se(serialize_usec(f, "usec1", USEC_INFINITY) == 0);
|
||||
assert_se(serialize_usec(f, "usec2", 0) == 1);
|
||||
assert_se(serialize_usec(f, "usec3", USEC_INFINITY-1) == 1);
|
||||
|
||||
rewind(f);
|
||||
|
||||
_cleanup_free_ char *line1 = NULL, *line2 = NULL;
|
||||
usec_t x;
|
||||
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
|
||||
assert_se(streq(line1, "usec2=0"));
|
||||
assert_se(deserialize_usec(line1 + 6, &x) == 0);
|
||||
assert_se(x == 0);
|
||||
|
||||
assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
|
||||
assert_se(startswith(line2, "usec3="));
|
||||
assert_se(deserialize_usec(line2 + 6, &x) == 0);
|
||||
assert_se(x == USEC_INFINITY-1);
|
||||
}
|
||||
|
||||
static void test_serialize_strv(void) {
|
||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
|
||||
char **strv = STRV_MAKE("a", "b", "foo foo",
|
||||
"nasty1 \"",
|
||||
"\"nasty2 ",
|
||||
"nasty3 '",
|
||||
"\"nasty4 \"",
|
||||
"nasty5\n",
|
||||
"\nnasty5\nfoo=bar",
|
||||
"\nnasty5\nfoo=bar");
|
||||
|
||||
assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, fn);
|
||||
|
||||
assert_se(serialize_strv(f, "strv1", NULL) == 0);
|
||||
assert_se(serialize_strv(f, "strv2", STRV_MAKE_EMPTY) == 0);
|
||||
assert_se(serialize_strv(f, "strv3", strv) == 1);
|
||||
assert_se(serialize_strv(f, "strv4", STRV_MAKE(long_string)) == -EINVAL);
|
||||
|
||||
rewind(f);
|
||||
|
||||
_cleanup_strv_free_ char **strv2 = NULL;
|
||||
for (;;) {
|
||||
_cleanup_free_ char *line = NULL;
|
||||
int r;
|
||||
|
||||
r = read_line(f, LONG_LINE_MAX, &line);
|
||||
if (r == 0)
|
||||
break;
|
||||
assert_se(r > 0);
|
||||
|
||||
const char *t = startswith(line, "strv3=");
|
||||
assert_se(t);
|
||||
|
||||
char *un;
|
||||
assert_se(cunescape(t, 0, &un) >= 0);
|
||||
assert_se(strv_consume(&strv2, un) >= 0);
|
||||
}
|
||||
|
||||
assert_se(strv_equal(strv, strv2));
|
||||
}
|
||||
|
||||
static void test_deserialize_environment(void) {
|
||||
_cleanup_strv_free_ char **env;
|
||||
|
||||
log_info("/* %s */", __func__);
|
||||
|
||||
assert_se(env = strv_new("A=1", NULL));
|
||||
|
||||
assert_se(deserialize_environment("B=2", &env) >= 0);
|
||||
assert_se(deserialize_environment("FOO%%=a\\177b\\nc\\td e", &env) >= 0);
|
||||
|
||||
assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2", "FOO%%=a\177b\nc\td e")));
|
||||
|
||||
assert_se(deserialize_environment("foo\\", &env) < 0);
|
||||
assert_se(deserialize_environment("bar\\_baz", &env) < 0);
|
||||
}
|
||||
|
||||
static void test_serialize_environment(void) {
|
||||
_cleanup_strv_free_ char **env = NULL, **env2 = NULL;
|
||||
_cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-env-util.XXXXXXX";
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
int r;
|
||||
|
||||
assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
|
||||
log_info("/* %s (%s) */", __func__, fn);
|
||||
|
||||
assert_se(env = strv_new("A=1",
|
||||
"B=2",
|
||||
"C=ąęółń",
|
||||
"D=D=a\\x0Ab",
|
||||
"FOO%%=a\177b\nc\td e",
|
||||
NULL));
|
||||
|
||||
assert_se(serialize_strv(f, "env", env) == 1);
|
||||
assert_se(fflush_and_check(f) == 0);
|
||||
|
||||
rewind(f);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *line = NULL;
|
||||
const char *l;
|
||||
|
||||
r = read_line(f, LONG_LINE_MAX, &line);
|
||||
assert_se(r >= 0);
|
||||
|
||||
if (r == 0)
|
||||
break;
|
||||
|
||||
l = strstrip(line);
|
||||
|
||||
assert_se(startswith(l, "env="));
|
||||
|
||||
r = deserialize_environment(l+4, &env2);
|
||||
assert_se(r >= 0);
|
||||
}
|
||||
assert_se(feof(f));
|
||||
|
||||
assert_se(strv_equal(env, env2));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_setup_logging(LOG_INFO);
|
||||
|
||||
memset(long_string, 'x', sizeof(long_string)-1);
|
||||
char_array_0(long_string);
|
||||
|
||||
test_serialize_item();
|
||||
test_serialize_item_escaped();
|
||||
test_serialize_usec();
|
||||
test_serialize_strv();
|
||||
test_deserialize_environment();
|
||||
test_serialize_environment();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
|
@ -32,15 +32,11 @@ static void test_read_one_char(void) {
|
|||
char r;
|
||||
bool need_nl;
|
||||
char name[] = "/tmp/test-read_one_char.XXXXXX";
|
||||
int fd;
|
||||
|
||||
fd = mkostemp_safe(name);
|
||||
assert_se(fd >= 0);
|
||||
file = fdopen(fd, "r+");
|
||||
assert_se(file);
|
||||
assert(fmkostemp_safe(name, "r+", &file) == 0);
|
||||
|
||||
assert_se(fputs("c\n", file) >= 0);
|
||||
rewind(file);
|
||||
|
||||
assert_se(read_one_char(file, &r, 1000000, &need_nl) >= 0);
|
||||
assert_se(!need_nl);
|
||||
assert_se(r == 'c');
|
||||
|
|
Loading…
Reference in New Issue