1 /**
2  * Internal functions used in unittests.
3  */
4 module during.tests.base;
5 
6 import core.sys.linux.fcntl;
7 
8 package:
9 
10 version (D_BetterC) string errmsg; // used to pass error texts on tests that can't be completed
11 
12 auto getTestFileName(string baseName)()
13 {
14     import core.stdc.stdlib : rand, srand;
15     import core.sys.posix.pthread : pthread_self;
16     import core.sys.posix.time : clock_gettime, CLOCK_REALTIME, timespec;
17 
18     // make rand a bit more random - nothing fancy needed
19     timespec t;
20     auto tr = clock_gettime(CLOCK_REALTIME, &t);
21     assert(tr == 0);
22     srand(cast(uint)(t.tv_nsec * pthread_self()));
23 
24     static immutable ubyte[] let = cast(immutable(ubyte[]))"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
25     char[baseName.length + 16] fname = baseName ~ "_**********.dat\0";
26 
27     foreach (i; 0..10)
28     {
29         fname[baseName.length + 1 + i] = let[rand() % let.length];
30     }
31     return fname;
32 }
33 
34 auto openFile(T)(T fname, int flags)
35 {
36     auto f = open(&fname[0], flags, 0x1a4); //0644 (std.conv.octal doesn't work with betterC)
37     assert(f >= 0, "Failed to open file");
38     return f;
39 }
40 
41 // Check if the kernel release of our system is at least at the major.minor version
42 bool checkKernelVersion(uint emajor, uint eminor) @safe
43 {
44     import core.stdc.stdio : sscanf, printf;
45     utsname buf;
46     if (() @trusted { return syscall(SYS_uname, &buf); }() < 0) {
47         assert(0, "call to uname failed");
48     }
49 
50     int major, minor;
51     () @trusted { sscanf(buf.release.ptr, "%d.%d", &major, &minor); }(); // we only care about the first two numbers
52     if (major < emajor) return false; // is our retrieved major below the expected major?
53     if (minor < eminor) return false; // is our retrieved minor below the expected minor?
54     return true;
55 }
56 
57 
58 private:
59 
60 struct utsname
61 {
62     char[65] sysname;    /* Operating system name (e.g., "Linux") */
63     char[65] nodename;   /* Name within "some implementation-defined network" */
64     char[65] release;    /* Operating system release (e.g., "2.6.28") */
65     char[65] version_;   /* Operating system version */
66     char[65] machine;    /* Hardware identifier */
67     char[65] domainname; /* Domain name (not guaranteed to be filled) */
68 }
69 
70 version (X86) enum SYS_uname = 122;
71 else version (X86_64) enum SYS_uname = 63;
72 else static assert(0, "Unsupported platform");
73 
74 extern (C) int syscall(int sysno, ...);