~subunit/subunit/trunk

« back to all changes in this revision

Viewing changes to c/tests/test_child.c

  • Committer: Robert Collins
  • Date: 2006-04-15 02:37:24 UTC
  • Revision ID: robertc@robertcollins.net-20060415023724-5ff81bbdda3afa4f
Start C language bindings.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 *
 
3
 *  subunit C bindings.
 
4
 *  Copyright (C) 2006  Robert Collins <robertc@robertcollins.net>
 
5
 *
 
6
 *  This program is free software; you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation; either version 2 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  This program is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with this program; if not, write to the Free Software
 
18
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
19
 **/
 
20
 
 
21
#include <stdlib.h>
 
22
#include <unistd.h>
 
23
#include <check.h>
 
24
 
 
25
#include "subunit/child.h"
 
26
 
 
27
START_TEST (test_start)
 
28
{
 
29
    /* test that the start function emits a correct test: line. */
 
30
    int bytecount;
 
31
    int old_stdout;
 
32
    int new_stdout[2];
 
33
    char buffer[100];
 
34
    /* we need a socketpair to capture stdout in */
 
35
    fail_if(pipe(new_stdout), "Failed to create a socketpair.");
 
36
    /* backup stdout so we can replace it */
 
37
    old_stdout = dup(1);
 
38
    if (old_stdout == -1) {
 
39
      close(new_stdout[0]);
 
40
      close(new_stdout[1]);
 
41
      fail("Failed to backup stdout before replacing.");
 
42
    }
 
43
    /* redirect stdout so we can analyse it */
 
44
    if (dup2(new_stdout[1], 1) != 1) {
 
45
      close(old_stdout);
 
46
      close(new_stdout[0]);
 
47
      close(new_stdout[1]);
 
48
      fail("Failed to redirect stdout");
 
49
    }
 
50
    /* yes this can block. Its a test case with < 100 bytes of output.
 
51
     * DEAL.
 
52
     */
 
53
    subunit_test_start("test case");
 
54
    /* restore stdout now */
 
55
    if (dup2(old_stdout, 1) != 1) {
 
56
      close(old_stdout);
 
57
      close(new_stdout[0]);
 
58
      close(new_stdout[1]);
 
59
      fail("Failed to restore stdout");
 
60
    }
 
61
    /* and we dont need the write side any more */
 
62
    if (close(new_stdout[1])) {
 
63
      close(new_stdout[0]);
 
64
      fail("Failed to close write side of socketpair.");
 
65
    }
 
66
    /* get the output */
 
67
    bytecount = read(new_stdout[0], buffer, 100);
 
68
    if (0 > bytecount) {
 
69
      close(new_stdout[0]);
 
70
      fail("Failed to read captured output.");
 
71
    }
 
72
    buffer[bytecount]='\0';
 
73
    /* and we dont need the read side any more */
 
74
    fail_if(close(new_stdout[0]), "Failed to close write side of socketpair.");
 
75
    /* compare with expected outcome */
 
76
#define EXPECTED "test: test case\n"
 
77
    fail_if(strcmp(EXPECTED, buffer), "Did not get expected output [%s], got [%s]", EXPECTED, buffer);
 
78
#undef EXPECTED
 
79
}
 
80
END_TEST
 
81
 
 
82
 
 
83
Suite *child_suite(void)
 
84
{
 
85
    Suite *s = suite_create("subunit_child");
 
86
    TCase *tc_core = tcase_create("Core");
 
87
    suite_add_tcase (s, tc_core);
 
88
    tcase_add_test (tc_core, test_start);
 
89
    return s;
 
90
}
 
91
 
 
92
int
 
93
main(void)
 
94
{
 
95
  int nf;
 
96
  Suite *s = child_suite();
 
97
  SRunner *sr = srunner_create(s);
 
98
  srunner_run_all(sr, CK_NORMAL);
 
99
  nf = srunner_ntests_failed(sr);
 
100
  srunner_free(sr);
 
101
  return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 
102
}