File: test_state_machine.c

package info (click to toggle)
portsentry 2.0.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,396 kB
  • sloc: ansic: 6,473; sh: 916; perl: 18; makefile: 5
file content (154 lines) | stat: -rw-r--r-- 3,921 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "../src/portsentry.h"
#include "../src/config_data.h"
#include "../src/state_machine.h"

#include "../src/config_data.h"

struct sockaddr_in CreateIpv4Addr(const char *ip_str);
struct sockaddr_in6 CreateIpv6Addr(const char *ip_str);
void TestUninitializedState(void);
void TestTriggerCountZero(void);
void TestIpv4TriggerLogic(void);
void TestIpv4Eviction(void);
void TestIpv6TriggerLogic(void);
void TestIpv6Eviction(void);
void TestUnsupportedFamily(void);

struct sockaddr_in CreateIpv4Addr(const char *ip_str) {
  struct sockaddr_in addr;
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  if (inet_pton(AF_INET, ip_str, &addr.sin_addr) != 1) {
    perror("inet_pton IPv4 failed");
    exit(EXIT_FAILURE);
  }
  return addr;
}

struct sockaddr_in6 CreateIpv6Addr(const char *ip_str) {
  struct sockaddr_in6 addr;
  memset(&addr, 0, sizeof(addr));
  addr.sin6_family = AF_INET6;
  if (inet_pton(AF_INET6, ip_str, &addr.sin6_addr) != 1) {
    perror("inet_pton IPv6 failed");
    exit(EXIT_FAILURE);
  }
  return addr;
}

void TestUninitializedState(void) {
  struct SentryState state;
  state.isInitialized = FALSE;
  struct sockaddr_in addr_ipv4 = CreateIpv4Addr("192.168.1.1");

  configData.configTriggerCount = 1;

  int result = CheckState(&state, (struct sockaddr *)&addr_ipv4);
  assert(result == ERROR);
}

void TestTriggerCountZero(void) {
  struct SentryState state;
  InitSentryState(&state);
  struct sockaddr_in addr_ipv4 = CreateIpv4Addr("192.168.1.1");

  configData.configTriggerCount = 0;

  int result = CheckState(&state, (struct sockaddr *)&addr_ipv4);
  assert(result == TRUE);

  FreeSentryState(&state);
}

void TestIpv4TriggerLogic(void) {
  struct SentryState state;
  InitSentryState(&state);
  struct sockaddr_in addr1 = CreateIpv4Addr("192.168.0.1");
  struct sockaddr_in addr2 = CreateIpv4Addr("192.168.0.2");

  configData.configTriggerCount = 3;
  int result;

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == FALSE);
  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == FALSE);

  result = CheckState(&state, (struct sockaddr *)&addr2);
  assert(result == FALSE);

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == TRUE);

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == TRUE);

  result = CheckState(&state, (struct sockaddr *)&addr2);
  assert(result == FALSE);

  result = CheckState(&state, (struct sockaddr *)&addr2);
  assert(result == TRUE);

  FreeSentryState(&state);
}

void TestIpv6TriggerLogic(void) {
  struct SentryState state;
  InitSentryState(&state);
  struct sockaddr_in6 addr1 = CreateIpv6Addr("2001:db8::1");
  struct sockaddr_in6 addr2 = CreateIpv6Addr("2001:db8::2");

  configData.configTriggerCount = 2;
  int result;

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == FALSE);

  result = CheckState(&state, (struct sockaddr *)&addr2);
  assert(result == FALSE);

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == TRUE);

  result = CheckState(&state, (struct sockaddr *)&addr1);
  assert(result == TRUE);

  result = CheckState(&state, (struct sockaddr *)&addr2);
  assert(result == TRUE);

  FreeSentryState(&state);
}

void TestUnsupportedFamily(void) {
  struct SentryState state;
  InitSentryState(&state);

  struct sockaddr unsupported_addr;
  unsupported_addr.sa_family = AF_UNIX;
  configData.configTriggerCount = 1;

  int result = CheckState(&state, &unsupported_addr);
  assert(result == ERROR);

  FreeSentryState(&state);
}

int main(void) {
  TestUninitializedState();
  TestTriggerCountZero();
  TestIpv4TriggerLogic();
  TestIpv6TriggerLogic();
  TestUnsupportedFamily();

  return 0;
}