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, ...);