blob: 9bdacb0c8851c62ab0fe57ede4d3b11f71a421d2 [file] [log] [blame]
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -04001/*
2 * tlsdated-unittest.c - tlsdated unit tests
3 * Copyright (c) 2012 The Chromium Authors. All rights reserved.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Brian Akerb12abad2012-10-16 01:25:00 -04008#include "config.h"
9
10#include "src/test_harness.h"
11#include "src/tlsdate.h"
12
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040013#include <fcntl.h>
14#include <limits.h>
15#include <stdlib.h>
16#include <unistd.h>
17
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040018FIXTURE(tempdir) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010019 char path[PATH_MAX];
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040020};
21
22FIXTURE_SETUP(tempdir) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010023 char *p;
24 strncpy(self->path, "/tmp/tlsdated-unit-XXXXXX", sizeof(self->path));
25 p = mkdtemp(self->path);
26 ASSERT_NE(NULL, p);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040027}
28
29int rmrf(char *dir) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010030 char buf[256];
31 snprintf(buf, sizeof(buf), "rm -rf %s", dir);
32 return system(buf);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040033}
34
35FIXTURE_TEARDOWN(tempdir) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010036 ASSERT_EQ(0, rmrf(self->path));
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040037}
38
39int write_time(const char *path, time_t time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010040 int fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0700);
41 if (fd == -1)
42 return 1;
43 if (write(fd, &time, sizeof(time)) != sizeof(time)) {
44 close(fd);
45 return 1;
46 }
47 return close(fd);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040048}
49
50int read_time(const char *path, time_t* time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010051 int fd = open(path, O_RDONLY);
52 if (fd == -1)
53 return 1;
54 if (read(fd, time, sizeof(*time)) != sizeof(*time)) {
55 close(fd);
56 return 1;
57 }
58 return close(fd);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040059}
60
61TEST(sane_time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010062 ASSERT_EQ(0, is_sane_time(0));
63 ASSERT_EQ(0, is_sane_time(INT_MAX));
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040064}
65
66TEST(sane_host_time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010067 ASSERT_EQ(1, is_sane_time(time(NULL)));
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040068}
69
70TEST_F(tempdir, load_time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010071 char buf[PATH_MAX];
72 time_t tm = 3;
73 time_t now = time(NULL);
74 snprintf(buf, sizeof(buf), "%s/load", self->path);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040075
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010076 ASSERT_EQ(0, write_time(buf, 0));
77 ASSERT_EQ(-1, load_disk_timestamp(buf, &tm));
78 ASSERT_EQ(3, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040079
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010080 ASSERT_EQ(0, write_time(buf, INT_MAX));
81 ASSERT_EQ(-1, load_disk_timestamp(buf, &tm));
82 ASSERT_EQ(3, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040083
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010084 ASSERT_EQ(0, write_time(buf, now));
85 ASSERT_EQ(0, truncate(buf, 2));
86 ASSERT_EQ(-1, load_disk_timestamp(buf, &tm));
87 ASSERT_EQ(3, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040088
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010089 ASSERT_EQ(0, unlink(buf));
90 ASSERT_EQ(-1, load_disk_timestamp(buf, &tm));
91 ASSERT_EQ(3, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040092
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010093 ASSERT_EQ(0, write_time(buf, now));
94 ASSERT_EQ(0, load_disk_timestamp(buf, &tm));
95 ASSERT_EQ(now, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -040096}
97
98TEST_F(tempdir, save_time) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +010099 char buf[PATH_MAX];
100 time_t now = time(NULL);
101 time_t tm;
102 snprintf(buf, sizeof(buf), "%s/save", self->path);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -0400103
Jacob Appelbaum8d751a02012-10-30 16:39:58 +0100104 save_disk_timestamp(buf, now);
105 ASSERT_EQ(0, read_time(buf, &tm));
106 EXPECT_EQ(now, tm);
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -0400107}
108
109TEST(tlsdate_tests) {
Jacob Appelbaum8d751a02012-10-30 16:39:58 +0100110 char *args[] = { "/nonexistent", NULL, NULL };
111 extern char **environ;
112 EXPECT_EQ(1, tlsdate(args, environ, 2, 1));
113 args[0] = "/bin/false";
114 EXPECT_EQ(1, tlsdate(args, environ, 2, 1));
115 args[0] = "/bin/true";
116 EXPECT_EQ(0, tlsdate(args, environ, 2, 1));
117 args[0] = "/bin/sleep";
118 args[1] = "3";
119 EXPECT_EQ(-1, tlsdate(args, environ, 2, 1));
120 EXPECT_EQ(0, tlsdate(args, environ, 2, 5));
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -0400121}
122
ellyccd12452013-01-11 14:44:17 -0500123TEST(jitter) {
124 int i = 0;
125 int r;
126 const int kBase = 100;
127 const int kJitter = 25;
128 int nonequal = 0;
129 for (i = 0; i < 1000; i++) {
130 r = add_jitter(kBase, kJitter);
131 EXPECT_GE(r, kBase - kJitter);
132 EXPECT_LE(r, kBase + kJitter);
133 if (r != kBase)
134 nonequal++;
135 }
136 EXPECT_NE(nonequal, 0);
137}
138
Elly Fong-Jones6fb0d4b2012-10-06 14:10:37 -0400139TEST_HARNESS_MAIN