Bug 545892 - Always pass WM_NCPAINT events to the default event procedure. r=bent...
[mozilla-central.git] / xpcom / tests / unit / test_symlinks.js
blob510d3a234eaffae406fb2d4974a9130e9bd98bf0
1 const CWD = do_get_cwd();
2 function checkOS(os) {
3   const nsILocalFile_ = "nsILocalFile" + os;
4   return nsILocalFile_ in Components.interfaces &&
5          CWD instanceof Components.interfaces[nsILocalFile_];
8 const DIR_TARGET     = "target";
9 const DIR_LINK       = "link";
10 const DIR_LINK_LINK  = "link_link";
11 const FILE_TARGET    = "target.txt";
12 const FILE_LINK      = "link.txt";
13 const FILE_LINK_LINK = "link_link.txt";
15 const DOES_NOT_EXIST = "doesnotexist";
16 const DANGLING_LINK  = "dangling_link";
17 const LOOP_LINK      = "loop_link";
19 const isWin = checkOS("Win");
20 const isOS2 = checkOS("OS2");
21 const isMac = checkOS("Mac");
22 const isUnix = !(isWin || isOS2 || isMac);
24 const nsIFile = Components.interfaces.nsIFile;
26 var process;
27 function createSymLink(from, to) {
28   if (!process) {
29     var ln = Components.classes["@mozilla.org/file/local;1"]
30                        .createInstance(Components.interfaces.nsILocalFile);
31     ln.initWithPath("/bin/ln");
33     process = Components.classes["@mozilla.org/process/util;1"]
34                         .createInstance(Components.interfaces.nsIProcess);
35     process.init(ln);
36   }
38   const args = ["-s", from, to];
39   process.run(true, args, args.length);
40   do_check_eq(process.exitValue, 0);
43 function makeSymLink(from, toName, relative) {
44   var to = from.parent;
45   to.append(toName);
47   if (relative) {
48     createSymLink(from.leafName, to.path);
49   }
50   else {
51     createSymLink(from.path, to.path);
52   }
54   do_check_true(to.isSymlink());
56   print("---");
57   print(from.path);
58   print(to.path);
59   print(to.target);
61   if (from.leafName != DOES_NOT_EXIST && from.isSymlink()) {
62     // XXXjag wish I could set followLinks to false so we'd just get
63     // the symlink's direct target instead of the final target.
64     do_check_eq(from.target, to.target);
65   }
66   else {
67     do_check_eq(from.path, to.target);
68   }
70   return to;
73 function setupTestDir(testDir, relative) {
74   var targetDir = testDir.clone();
75   targetDir.append(DIR_TARGET);
77   if (testDir.exists()) {
78     testDir.remove(true);
79   }
80   do_check_true(!testDir.exists());
82   testDir.create(nsIFile.DIRECTORY_TYPE, 0777);
84   targetDir.create(nsIFile.DIRECTORY_TYPE, 0777);
86   var targetFile = testDir.clone();
87   targetFile.append(FILE_TARGET);
88   targetFile.create(nsIFile.NORMAL_FILE_TYPE, 0666);
90   var imaginary = testDir.clone();
91   imaginary.append(DOES_NOT_EXIST);
93   var loop = testDir.clone();
94   loop.append(LOOP_LINK);
96   var dirLink  = makeSymLink(targetDir, DIR_LINK, relative);
97   var fileLink = makeSymLink(targetFile, FILE_LINK, relative);
99   makeSymLink(dirLink, DIR_LINK_LINK, relative);
100   makeSymLink(fileLink, FILE_LINK_LINK, relative);
102   makeSymLink(imaginary, DANGLING_LINK, relative);
104   try {
105     makeSymLink(loop, LOOP_LINK, relative);
106     do_check_true(false);
107   }
108   catch (e) {
109   }
112 function createSpaces(dirs, files, links) {
113   function longest(a, b) a.length > b.length ? a : b;
114   return dirs.concat(files, links).reduce(longest, "").replace(/./g, " ");
117 function testSymLinks(testDir, relative) {
118   setupTestDir(testDir, relative);
120   const dirLinks   = [DIR_LINK, DIR_LINK_LINK];
121   const fileLinks  = [FILE_LINK, FILE_LINK_LINK];
122   const otherLinks = [DANGLING_LINK, LOOP_LINK];
123   const dirs  = [DIR_TARGET].concat(dirLinks);
124   const files = [FILE_TARGET].concat(fileLinks);
125   const links = otherLinks.concat(dirLinks, fileLinks);
127   const spaces = createSpaces(dirs, files, links);
128   const bools = {false: " false", true: " true "};
129   print(spaces + " dir   file  symlink");
130   var dirEntries = testDir.directoryEntries;
131   while (dirEntries.hasMoreElements()) {
132     const file = dirEntries.getNext().QueryInterface(nsIFile);
133     const name = file.leafName;
134     print(name + spaces.substring(name.length) + bools[file.isDirectory()] +
135           bools[file.isFile()] + bools[file.isSymlink()]);
136     do_check_eq(file.isDirectory(), dirs.indexOf(name) != -1);
137     do_check_eq(file.isFile(), files.indexOf(name) != -1);
138     do_check_eq(file.isSymlink(), links.indexOf(name) != -1);
139   }
142 function run_test() {
143   // Skip this test on Windows
144   if (isWin || isOS2)
145     return;
147   var testDir = CWD;
148   testDir.append("test_symlinks");
150   testSymLinks(testDir, false);
151   testSymLinks(testDir, true);