summaryrefslogtreecommitdiff
path: root/tests/test-tempname.c
blob: 3c1f664b607873093a4e3b882911fcf9112f9781 (plain)
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
/* Test of creating a temporary file.
   Copyright (C) 2022-2023 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

/* Written by Bruno Haible <bruno@clisp.org>, 2022.  */

#include <config.h>

#include "tempname.h"

#include <string.h>
#include <unistd.h>

#include "macros.h"

int
main ()
{
  /* Verify that two consecutive calls to gen_tempname return two different
     file names, with a high probability.  */
  const char *templ18 = "gl-temp-XXXXXX.xyz";
  char filename1[18 + 1];
  char filename2[18 + 1];

  /* Case 1: The first file still exists while gen_tempname is called a second
     time.  */
  {
    strcpy (filename1, templ18);
    int fd1 = gen_tempname (filename1, strlen (".xyz"), 0, GT_FILE);
    ASSERT (fd1 >= 0);

    strcpy (filename2, templ18);
    int fd2 = gen_tempname (filename2, strlen (".xyz"), 0, GT_FILE);
    ASSERT (fd2 >= 0);

    /* gen_tempname arranges (via O_EXCL) to not return the name of an existing
       file.  */
    ASSERT (strcmp (filename1, filename2) != 0);

    /* Clean up.  */
    close (fd1);
    close (fd2);
    unlink (filename1);
    unlink (filename2);
  }

  /* Case 2: The first file is deleted before gen_tempname is called a second
     time.  */
  {
    strcpy (filename1, templ18);
    int fd1 = gen_tempname (filename1, strlen (".xyz"), 0, GT_FILE);
    ASSERT (fd1 >= 0);

    /* Clean up.  */
    close (fd1);
    unlink (filename1);

    strcpy (filename2, templ18);
    int fd2 = gen_tempname (filename2, strlen (".xyz"), 0, GT_FILE);
    ASSERT (fd2 >= 0);

    /* With 6 'X' and a good pseudo-random number generator behind the scenes,
       the probability of getting the same file name twice in a row should be
       1/62^6 < 1/10^10.
       But on 64-bit native Windows, this probability is ca. 0.1% to 0.3%.  */
    ASSERT (strcmp (filename1, filename2) != 0);

    /* Clean up.  */
    close (fd2);
    unlink (filename2);
  }

  return 0;
}