summaryrefslogtreecommitdiffstats
path: root/toolkit/components/osfile/tests/xpcshell/test_path.js
blob: 8a945f67640b374f979ff8f0157dc827e335bdb7 (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

Services.prefs.setBoolPref("toolkit.osfile.test.syslib_necessary", false);
// We don't need libc/kernel32.dll for this test

const Win = ChromeUtils.import("resource://gre/modules/osfile/ospath_win.jsm");
const Unix = ChromeUtils.import(
  "resource://gre/modules/osfile/ospath_unix.jsm"
);

function do_check_fail(f) {
  try {
    let result = f();
    info("Failed do_check_fail: " + result);
    Assert.ok(false);
  } catch (ex) {
    Assert.ok(true);
  }
}

function run_test() {
  info("Testing Windows paths");

  info("Backslash-separated, no drive");
  Assert.equal(Win.basename("a\\b"), "b");
  Assert.equal(Win.basename("a\\b\\"), "");
  Assert.equal(Win.basename("abc"), "abc");
  Assert.equal(Win.dirname("a\\b"), "a");
  Assert.equal(Win.dirname("a\\b\\"), "a\\b");
  Assert.equal(Win.dirname("a\\\\\\\\b"), "a");
  Assert.equal(Win.dirname("abc"), ".");
  Assert.equal(Win.normalize("\\a\\b\\c"), "\\a\\b\\c");
  Assert.equal(Win.normalize("\\a\\b\\\\\\\\c"), "\\a\\b\\c");
  Assert.equal(Win.normalize("\\a\\b\\c\\\\\\"), "\\a\\b\\c");
  Assert.equal(Win.normalize("\\a\\b\\c\\..\\..\\..\\d\\e\\f"), "\\d\\e\\f");
  Assert.equal(Win.normalize("a\\b\\c\\..\\..\\..\\d\\e\\f"), "d\\e\\f");
  do_check_fail(() => Win.normalize("\\a\\b\\c\\..\\..\\..\\..\\d\\e\\f"));

  Assert.equal(
    Win.join("\\tmp", "foo", "bar"),
    "\\tmp\\foo\\bar",
    "join \\tmp,foo,bar"
  );
  Assert.equal(
    Win.join("\\tmp", "\\foo", "bar"),
    "\\foo\\bar",
    "join \\tmp,\\foo,bar"
  );
  Assert.equal(Win.winGetDrive("\\tmp"), null);
  Assert.equal(Win.winGetDrive("\\tmp\\a\\b\\c\\d\\e"), null);
  Assert.equal(Win.winGetDrive("\\"), null);

  info("Backslash-separated, with a drive");
  Assert.equal(Win.basename("c:a\\b"), "b");
  Assert.equal(Win.basename("c:a\\b\\"), "");
  Assert.equal(Win.basename("c:abc"), "abc");
  Assert.equal(Win.dirname("c:a\\b"), "c:a");
  Assert.equal(Win.dirname("c:a\\b\\"), "c:a\\b");
  Assert.equal(Win.dirname("c:a\\\\\\\\b"), "c:a");
  Assert.equal(Win.dirname("c:abc"), "c:");
  let options = {
    winNoDrive: true,
  };
  Assert.equal(Win.dirname("c:a\\b", options), "a");
  Assert.equal(Win.dirname("c:a\\b\\", options), "a\\b");
  Assert.equal(Win.dirname("c:a\\\\\\\\b", options), "a");
  Assert.equal(Win.dirname("c:abc", options), ".");
  Assert.equal(Win.join("c:", "abc"), "c:\\abc", "join c:,abc");

  Assert.equal(Win.normalize("c:"), "c:\\");
  Assert.equal(Win.normalize("c:\\"), "c:\\");
  Assert.equal(Win.normalize("c:\\a\\b\\c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:\\a\\b\\\\\\\\c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:\\\\\\\\a\\b\\c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:\\a\\b\\c\\\\\\"), "c:\\a\\b\\c");
  Assert.equal(
    Win.normalize("c:\\a\\b\\c\\..\\..\\..\\d\\e\\f"),
    "c:\\d\\e\\f"
  );
  Assert.equal(Win.normalize("c:a\\b\\c\\..\\..\\..\\d\\e\\f"), "c:\\d\\e\\f");
  do_check_fail(() => Win.normalize("c:\\a\\b\\c\\..\\..\\..\\..\\d\\e\\f"));

  Assert.equal(Win.join("c:\\", "foo"), "c:\\foo", "join c:,foo");
  Assert.equal(
    Win.join("c:\\tmp", "foo", "bar"),
    "c:\\tmp\\foo\\bar",
    "join c:\\tmp,foo,bar"
  );
  Assert.equal(
    Win.join("c:\\tmp", "\\foo", "bar"),
    "c:\\foo\\bar",
    "join c:\\tmp,\\foo,bar"
  );
  Assert.equal(
    Win.join("c:\\tmp", "c:\\foo", "bar"),
    "c:\\foo\\bar",
    "join c:\\tmp,c:\\foo,bar"
  );
  Assert.equal(
    Win.join("c:\\tmp", "c:foo", "bar"),
    "c:\\foo\\bar",
    "join c:\\tmp,c:foo,bar"
  );
  Assert.equal(Win.winGetDrive("c:"), "c:");
  Assert.equal(Win.winGetDrive("c:\\"), "c:");
  Assert.equal(Win.winGetDrive("c:abc"), "c:");
  Assert.equal(Win.winGetDrive("c:abc\\d\\e\\f\\g"), "c:");
  Assert.equal(Win.winGetDrive("c:\\abc"), "c:");
  Assert.equal(Win.winGetDrive("c:\\abc\\d\\e\\f\\g"), "c:");

  info("Forwardslash-separated, no drive");
  Assert.equal(Win.normalize("/a/b/c"), "\\a\\b\\c");
  Assert.equal(Win.normalize("/a/b////c"), "\\a\\b\\c");
  Assert.equal(Win.normalize("/a/b/c///"), "\\a\\b\\c");
  Assert.equal(Win.normalize("/a/b/c/../../../d/e/f"), "\\d\\e\\f");
  Assert.equal(Win.normalize("a/b/c/../../../d/e/f"), "d\\e\\f");

  info("Forwardslash-separated, with a drive");
  Assert.equal(Win.normalize("c:/"), "c:\\");
  Assert.equal(Win.normalize("c:/a/b/c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:/a/b////c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:////a/b/c"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:/a/b/c///"), "c:\\a\\b\\c");
  Assert.equal(Win.normalize("c:/a/b/c/../../../d/e/f"), "c:\\d\\e\\f");
  Assert.equal(Win.normalize("c:a/b/c/../../../d/e/f"), "c:\\d\\e\\f");

  info("Backslash-separated, UNC-style");
  Assert.equal(Win.basename("\\\\a\\b"), "b");
  Assert.equal(Win.basename("\\\\a\\b\\"), "");
  Assert.equal(Win.basename("\\\\abc"), "");
  Assert.equal(Win.dirname("\\\\a\\b"), "\\\\a");
  Assert.equal(Win.dirname("\\\\a\\b\\"), "\\\\a\\b");
  Assert.equal(Win.dirname("\\\\a\\\\\\\\b"), "\\\\a");
  Assert.equal(Win.dirname("\\\\abc"), "\\\\abc");
  Assert.equal(Win.normalize("\\\\a\\b\\c"), "\\\\a\\b\\c");
  Assert.equal(Win.normalize("\\\\a\\b\\\\\\\\c"), "\\\\a\\b\\c");
  Assert.equal(Win.normalize("\\\\a\\b\\c\\\\\\"), "\\\\a\\b\\c");
  Assert.equal(Win.normalize("\\\\a\\b\\c\\..\\..\\d\\e\\f"), "\\\\a\\d\\e\\f");
  do_check_fail(() => Win.normalize("\\\\a\\b\\c\\..\\..\\..\\d\\e\\f"));

  Assert.equal(Win.join("\\\\a\\tmp", "foo", "bar"), "\\\\a\\tmp\\foo\\bar");
  Assert.equal(Win.join("\\\\a\\tmp", "\\foo", "bar"), "\\\\a\\foo\\bar");
  Assert.equal(Win.join("\\\\a\\tmp", "\\\\foo\\", "bar"), "\\\\foo\\bar");
  Assert.equal(Win.winGetDrive("\\\\"), null);
  Assert.equal(Win.winGetDrive("\\\\c"), "\\\\c");
  Assert.equal(Win.winGetDrive("\\\\c\\abc"), "\\\\c");

  info("Testing unix paths");
  Assert.equal(Unix.basename("a/b"), "b");
  Assert.equal(Unix.basename("a/b/"), "");
  Assert.equal(Unix.basename("abc"), "abc");
  Assert.equal(Unix.dirname("a/b"), "a");
  Assert.equal(Unix.dirname("a/b/"), "a/b");
  Assert.equal(Unix.dirname("a////b"), "a");
  Assert.equal(Unix.dirname("abc"), ".");
  Assert.equal(Unix.normalize("/a/b/c"), "/a/b/c");
  Assert.equal(Unix.normalize("/a/b////c"), "/a/b/c");
  Assert.equal(Unix.normalize("////a/b/c"), "/a/b/c");
  Assert.equal(Unix.normalize("/a/b/c///"), "/a/b/c");
  Assert.equal(Unix.normalize("/a/b/c/../../../d/e/f"), "/d/e/f");
  Assert.equal(Unix.normalize("a/b/c/../../../d/e/f"), "d/e/f");
  do_check_fail(() => Unix.normalize("/a/b/c/../../../../d/e/f"));

  Assert.equal(
    Unix.join("/tmp", "foo", "bar"),
    "/tmp/foo/bar",
    "join /tmp,foo,bar"
  );
  Assert.equal(
    Unix.join("/tmp", "/foo", "bar"),
    "/foo/bar",
    "join /tmp,/foo,bar"
  );

  info("Testing the presence of ospath.jsm");
  let scope;
  try {
    scope = ChromeUtils.import("resource://gre/modules/osfile/ospath.jsm");
  } catch (ex) {
    // Can't load ospath
  }
  Assert.ok(!!scope.basename);
}