blob: 78986e0f5e6fc11b1b16db0d0ed75b9da6e9c80c [file] [log] [blame]
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00001// Copyright 2014 The Bazel Authors. All rights reserved.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package com.google.devtools.build.lib.vfs;
15
Googler2258b812017-12-19 12:25:43 -080016import static com.google.common.collect.ImmutableList.toImmutableList;
Ulf Adams795895a2015-03-06 15:58:35 +000017import static com.google.common.truth.Truth.assertThat;
tomlua729b9b2018-02-08 15:32:00 -080018import static com.google.devtools.build.lib.vfs.PathFragment.create;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010019
20import com.google.common.collect.ImmutableList;
Mark Schallerb8154322015-06-22 16:02:24 +000021import com.google.common.collect.ImmutableSet;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010022import com.google.common.collect.Lists;
23import com.google.common.testing.EqualsTester;
shahan20f35b42018-02-28 15:57:33 -080024import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
tomlua729b9b2018-02-08 15:32:00 -080025import com.google.devtools.build.lib.testutil.MoreAsserts;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010026import com.google.devtools.build.lib.testutil.TestUtils;
27import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
Philipp Wollermannd628b802016-10-19 12:14:38 +000028import java.io.File;
29import java.util.Collections;
30import java.util.List;
Laszlo Csomorca99bb72016-10-25 13:15:55 +000031import org.junit.Test;
32import org.junit.runner.RunWith;
33import org.junit.runners.JUnit4;
Philipp Wollermannd628b802016-10-19 12:14:38 +000034
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010035/**
36 * This class tests the functionality of the PathFragment.
37 */
38@RunWith(JUnit4.class)
39public class PathFragmentTest {
Michajlo Matijkiwbaf44c92016-06-23 21:54:05 +000040
41 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010042 public void testEqualsAndHashCode() {
43 InMemoryFileSystem filesystem = new InMemoryFileSystem();
44
45 new EqualsTester()
Laszlo Csomorca99bb72016-10-25 13:15:55 +000046 .addEqualityGroup(
tomlua729b9b2018-02-08 15:32:00 -080047 create("../relative/path"),
48 create("..").getRelative("relative").getRelative("path"),
49 create(new File("../relative/path").getPath()))
50 .addEqualityGroup(create("something/else"))
51 .addEqualityGroup(create("/something/else"))
52 .addEqualityGroup(create("/"), create("//////"))
53 .addEqualityGroup(create(""), PathFragment.EMPTY_FRAGMENT)
tomlu6c919062018-01-11 17:32:09 -080054 .addEqualityGroup(filesystem.getPath("/")) // A Path object.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010055 .testEquals();
56 }
57
58 @Test
59 public void testHashCodeCache() {
tomlua729b9b2018-02-08 15:32:00 -080060 PathFragment relativePath = create("../relative/path");
61 PathFragment rootPath = create("/");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010062
63 int oldResult = relativePath.hashCode();
64 int rootResult = rootPath.hashCode();
lberkiaea56b32017-05-30 12:35:33 +020065 assertThat(relativePath.hashCode()).isEqualTo(oldResult);
66 assertThat(rootPath.hashCode()).isEqualTo(rootResult);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010067 }
68
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010069 @Test
70 public void testRelativeTo() {
tomlua729b9b2018-02-08 15:32:00 -080071 assertThat(create("foo/bar/baz").relativeTo("foo").getPathString()).isEqualTo("bar/baz");
72 assertThat(create("/foo/bar/baz").relativeTo("/foo").getPathString()).isEqualTo("bar/baz");
73 assertThat(create("foo/bar/baz").relativeTo("foo/bar").getPathString()).isEqualTo("baz");
74 assertThat(create("/foo/bar/baz").relativeTo("/foo/bar").getPathString()).isEqualTo("baz");
75 assertThat(create("/foo").relativeTo("/").getPathString()).isEqualTo("foo");
76 assertThat(create("foo").relativeTo("").getPathString()).isEqualTo("foo");
77 assertThat(create("foo/bar").relativeTo("").getPathString()).isEqualTo("foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010078 }
79
80 @Test
81 public void testIsAbsolute() {
tomlua729b9b2018-02-08 15:32:00 -080082 assertThat(create("/absolute/test").isAbsolute()).isTrue();
83 assertThat(create("relative/test").isAbsolute()).isFalse();
84 assertThat(create(new File("/absolute/test").getPath()).isAbsolute()).isTrue();
85 assertThat(create(new File("relative/test").getPath()).isAbsolute()).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010086 }
87
88 @Test
89 public void testIsNormalized() {
tomlua729b9b2018-02-08 15:32:00 -080090 assertThat(PathFragment.isNormalized("/absolute/path")).isTrue();
91 assertThat(PathFragment.isNormalized("some//path")).isTrue();
92 assertThat(PathFragment.isNormalized("some/./path")).isFalse();
93 assertThat(PathFragment.isNormalized("../some/path")).isFalse();
94 assertThat(PathFragment.isNormalized("./some/path")).isFalse();
95 assertThat(PathFragment.isNormalized("some/path/..")).isFalse();
96 assertThat(PathFragment.isNormalized("some/path/.")).isFalse();
97 assertThat(PathFragment.isNormalized("some/other/../path")).isFalse();
98 assertThat(PathFragment.isNormalized("some/other//tricky..path..")).isTrue();
99 assertThat(PathFragment.isNormalized("/some/other//tricky..path..")).isTrue();
100 }
101
102 @Test
103 public void testContainsUpLevelReferences() {
104 assertThat(PathFragment.containsUplevelReferences("/absolute/path")).isFalse();
105 assertThat(PathFragment.containsUplevelReferences("some//path")).isFalse();
106 assertThat(PathFragment.containsUplevelReferences("some/./path")).isFalse();
107 assertThat(PathFragment.containsUplevelReferences("../some/path")).isTrue();
108 assertThat(PathFragment.containsUplevelReferences("./some/path")).isFalse();
109 assertThat(PathFragment.containsUplevelReferences("some/path/..")).isTrue();
110 assertThat(PathFragment.containsUplevelReferences("some/path/.")).isFalse();
111 assertThat(PathFragment.containsUplevelReferences("some/other/../path")).isTrue();
112 assertThat(PathFragment.containsUplevelReferences("some/other//tricky..path..")).isFalse();
113 assertThat(PathFragment.containsUplevelReferences("/some/other//tricky..path..")).isFalse();
114
115 // Normalization cannot remove leading uplevel references, so this will be true
116 assertThat(create("../some/path").containsUplevelReferences()).isTrue();
117 // Normalization will remove these, so no uplevel references left
118 assertThat(create("some/path/..").containsUplevelReferences()).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100119 }
120
121 @Test
122 public void testRootNodeReturnsRootString() {
tomlua729b9b2018-02-08 15:32:00 -0800123 PathFragment rootFragment = create("/");
lberkiaea56b32017-05-30 12:35:33 +0200124 assertThat(rootFragment.getPathString()).isEqualTo("/");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100125 }
126
127 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100128 public void testGetRelative() {
tomlua729b9b2018-02-08 15:32:00 -0800129 assertThat(create("a").getRelative("b").getPathString()).isEqualTo("a/b");
130 assertThat(create("a/b").getRelative("c/d").getPathString()).isEqualTo("a/b/c/d");
131 assertThat(create("c/d").getRelative("/a/b").getPathString()).isEqualTo("/a/b");
132 assertThat(create("a").getRelative("").getPathString()).isEqualTo("a");
133 assertThat(create("/").getRelative("").getPathString()).isEqualTo("/");
134 assertThat(create("a/b").getRelative("../foo").getPathString()).isEqualTo("a/foo");
135 assertThat(create("/a/b").getRelative("../foo").getPathString()).isEqualTo("/a/foo");
136
137 // Make sure any fast path of PathFragment#getRelative(PathFragment) works
138 assertThat(create("a/b").getRelative(create("../foo")).getPathString()).isEqualTo("a/foo");
139 assertThat(create("/a/b").getRelative(create("../foo")).getPathString()).isEqualTo("/a/foo");
140
141 // Make sure any fast path of PathFragment#getRelative(PathFragment) works
142 assertThat(create("c/d").getRelative(create("/a/b")).getPathString()).isEqualTo("/a/b");
143
144 // Test normalization
145 assertThat(create("a").getRelative(".").getPathString()).isEqualTo("a");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100146 }
147
148 @Test
nharmata90750e62018-03-15 09:35:48 -0700149 public void testIsNormalizedRelativePath() {
150 assertThat(PathFragment.isNormalizedRelativePath("/a")).isFalse();
151 assertThat(PathFragment.isNormalizedRelativePath("a///b")).isFalse();
152 assertThat(PathFragment.isNormalizedRelativePath("../a")).isFalse();
153 assertThat(PathFragment.isNormalizedRelativePath("a/../b")).isFalse();
154 assertThat(PathFragment.isNormalizedRelativePath("a/b")).isTrue();
155 assertThat(PathFragment.isNormalizedRelativePath("ab")).isTrue();
156 }
157
158 @Test
159 public void testContainsSeparator() {
160 assertThat(PathFragment.containsSeparator("/a")).isTrue();
161 assertThat(PathFragment.containsSeparator("a///b")).isTrue();
162 assertThat(PathFragment.containsSeparator("../a")).isTrue();
163 assertThat(PathFragment.containsSeparator("a/../b")).isTrue();
164 assertThat(PathFragment.containsSeparator("a/b")).isTrue();
165 assertThat(PathFragment.containsSeparator("ab")).isFalse();
166 }
167
168 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100169 public void testGetChildWorks() {
tomlua729b9b2018-02-08 15:32:00 -0800170 PathFragment pf = create("../some/path");
171 assertThat(pf.getChild("hi")).isEqualTo(create("../some/path/hi"));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100172 }
173
174 @Test
175 public void testGetChildRejectsInvalidBaseNames() {
tomlua729b9b2018-02-08 15:32:00 -0800176 PathFragment pf = create("../some/path");
cushon978cb002018-02-24 14:05:37 -0800177 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild("."));
178 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild(".."));
179 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild("x/y"));
180 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild("/y"));
181 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild("y/"));
182 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> pf.getChild(""));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100183 }
184
185 @Test
186 public void testEmptyPathToEmptyPath() {
tomlua729b9b2018-02-08 15:32:00 -0800187 assertThat(create("/").getPathString()).isEqualTo("/");
188 assertThat(create("").getPathString()).isEqualTo("");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100189 }
190
191 @Test
192 public void testRedundantSlashes() {
tomlua729b9b2018-02-08 15:32:00 -0800193 assertThat(create("///").getPathString()).isEqualTo("/");
194 assertThat(create("/foo///bar").getPathString()).isEqualTo("/foo/bar");
195 assertThat(create("////foo//bar").getPathString()).isEqualTo("/foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100196 }
197
198 @Test
199 public void testSimpleNameToSimpleName() {
tomlua729b9b2018-02-08 15:32:00 -0800200 assertThat(create("/foo").getPathString()).isEqualTo("/foo");
201 assertThat(create("foo").getPathString()).isEqualTo("foo");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100202 }
203
204 @Test
205 public void testSimplePathToSimplePath() {
tomlua729b9b2018-02-08 15:32:00 -0800206 assertThat(create("/foo/bar").getPathString()).isEqualTo("/foo/bar");
207 assertThat(create("foo/bar").getPathString()).isEqualTo("foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100208 }
209
210 @Test
211 public void testStripsTrailingSlash() {
tomlua729b9b2018-02-08 15:32:00 -0800212 assertThat(create("/foo/bar/").getPathString()).isEqualTo("/foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100213 }
214
215 @Test
216 public void testGetParentDirectory() {
tomlua729b9b2018-02-08 15:32:00 -0800217 PathFragment fooBarWiz = create("foo/bar/wiz");
218 PathFragment fooBar = create("foo/bar");
219 PathFragment foo = create("foo");
220 PathFragment empty = create("");
lberkiaea56b32017-05-30 12:35:33 +0200221 assertThat(fooBarWiz.getParentDirectory()).isEqualTo(fooBar);
222 assertThat(fooBar.getParentDirectory()).isEqualTo(foo);
223 assertThat(foo.getParentDirectory()).isEqualTo(empty);
224 assertThat(empty.getParentDirectory()).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100225
tomlua729b9b2018-02-08 15:32:00 -0800226 PathFragment fooBarWizAbs = create("/foo/bar/wiz");
227 PathFragment fooBarAbs = create("/foo/bar");
228 PathFragment fooAbs = create("/foo");
229 PathFragment rootAbs = create("/");
lberkiaea56b32017-05-30 12:35:33 +0200230 assertThat(fooBarWizAbs.getParentDirectory()).isEqualTo(fooBarAbs);
231 assertThat(fooBarAbs.getParentDirectory()).isEqualTo(fooAbs);
232 assertThat(fooAbs.getParentDirectory()).isEqualTo(rootAbs);
233 assertThat(rootAbs.getParentDirectory()).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100234 }
Michajlo Matijkiwbaf44c92016-06-23 21:54:05 +0000235
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100236 @Test
237 public void testSegmentsCount() {
tomlua729b9b2018-02-08 15:32:00 -0800238 assertThat(create("foo/bar").segmentCount()).isEqualTo(2);
239 assertThat(create("/foo/bar").segmentCount()).isEqualTo(2);
240 assertThat(create("foo//bar").segmentCount()).isEqualTo(2);
241 assertThat(create("/foo//bar").segmentCount()).isEqualTo(2);
242 assertThat(create("foo/").segmentCount()).isEqualTo(1);
243 assertThat(create("/foo/").segmentCount()).isEqualTo(1);
244 assertThat(create("foo").segmentCount()).isEqualTo(1);
245 assertThat(create("/foo").segmentCount()).isEqualTo(1);
246 assertThat(create("/").segmentCount()).isEqualTo(0);
247 assertThat(create("").segmentCount()).isEqualTo(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100248 }
249
250
251 @Test
252 public void testGetSegment() {
tomlua729b9b2018-02-08 15:32:00 -0800253 assertThat(create("foo/bar").getSegment(0)).isEqualTo("foo");
254 assertThat(create("foo/bar").getSegment(1)).isEqualTo("bar");
255 assertThat(create("/foo/bar").getSegment(0)).isEqualTo("foo");
256 assertThat(create("/foo/bar").getSegment(1)).isEqualTo("bar");
257 assertThat(create("foo/").getSegment(0)).isEqualTo("foo");
258 assertThat(create("/foo/").getSegment(0)).isEqualTo("foo");
259 assertThat(create("foo").getSegment(0)).isEqualTo("foo");
260 assertThat(create("/foo").getSegment(0)).isEqualTo("foo");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100261 }
262
263 @Test
264 public void testBasename() throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800265 assertThat(create("foo/bar").getBaseName()).isEqualTo("bar");
266 assertThat(create("/foo/bar").getBaseName()).isEqualTo("bar");
267 assertThat(create("foo/").getBaseName()).isEqualTo("foo");
268 assertThat(create("/foo/").getBaseName()).isEqualTo("foo");
269 assertThat(create("foo").getBaseName()).isEqualTo("foo");
270 assertThat(create("/foo").getBaseName()).isEqualTo("foo");
271 assertThat(create("/").getBaseName()).isEmpty();
272 assertThat(create("").getBaseName()).isEmpty();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100273 }
274
Paul Roberts8c443ef2016-10-18 02:04:25 +0000275 @Test
276 public void testFileExtension() throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800277 assertThat(create("foo.bar").getFileExtension()).isEqualTo("bar");
278 assertThat(create("foo.barr").getFileExtension()).isEqualTo("barr");
279 assertThat(create("foo.b").getFileExtension()).isEqualTo("b");
280 assertThat(create("foo.").getFileExtension()).isEmpty();
281 assertThat(create("foo").getFileExtension()).isEmpty();
282 assertThat(create(".").getFileExtension()).isEmpty();
283 assertThat(create("").getFileExtension()).isEmpty();
284 assertThat(create("foo/bar.baz").getFileExtension()).isEqualTo("baz");
285 assertThat(create("foo.bar.baz").getFileExtension()).isEqualTo("baz");
286 assertThat(create("foo.bar/baz").getFileExtension()).isEmpty();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100287 }
288
289 @Test
290 public void testReplaceName() throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800291 assertThat(create("foo/bar").replaceName("baz").getPathString()).isEqualTo("foo/baz");
292 assertThat(create("/foo/bar").replaceName("baz").getPathString()).isEqualTo("/foo/baz");
293 assertThat(create("foo/bar").replaceName("").getPathString()).isEqualTo("foo");
294 assertThat(create("foo/").replaceName("baz").getPathString()).isEqualTo("baz");
295 assertThat(create("/foo/").replaceName("baz").getPathString()).isEqualTo("/baz");
296 assertThat(create("foo").replaceName("baz").getPathString()).isEqualTo("baz");
297 assertThat(create("/foo").replaceName("baz").getPathString()).isEqualTo("/baz");
298 assertThat(create("/").replaceName("baz")).isNull();
299 assertThat(create("/").replaceName("")).isNull();
300 assertThat(create("").replaceName("baz")).isNull();
301 assertThat(create("").replaceName("")).isNull();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100302
tomlua729b9b2018-02-08 15:32:00 -0800303 assertThat(create("foo/bar").replaceName("bar/baz").getPathString()).isEqualTo("foo/bar/baz");
304 assertThat(create("foo/bar").replaceName("bar/baz/").getPathString()).isEqualTo("foo/bar/baz");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100305
306 // Absolute path arguments will clobber the original path.
tomlua729b9b2018-02-08 15:32:00 -0800307 assertThat(create("foo/bar").replaceName("/absolute").getPathString()).isEqualTo("/absolute");
308 assertThat(create("foo/bar").replaceName("/").getPathString()).isEqualTo("/");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100309 }
310 @Test
311 public void testSubFragment() throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800312 assertThat(create("/foo/bar/baz").subFragment(0, 3).getPathString()).isEqualTo("/foo/bar/baz");
313 assertThat(create("foo/bar/baz").subFragment(0, 3).getPathString()).isEqualTo("foo/bar/baz");
314 assertThat(create("/foo/bar/baz").subFragment(0, 2).getPathString()).isEqualTo("/foo/bar");
315 assertThat(create("/foo/bar/baz").subFragment(1, 3).getPathString()).isEqualTo("bar/baz");
316 assertThat(create("/foo/bar/baz").subFragment(0, 1).getPathString()).isEqualTo("/foo");
317 assertThat(create("/foo/bar/baz").subFragment(1, 2).getPathString()).isEqualTo("bar");
318 assertThat(create("/foo/bar/baz").subFragment(2, 3).getPathString()).isEqualTo("baz");
319 assertThat(create("/foo/bar/baz").subFragment(0, 0).getPathString()).isEqualTo("/");
320 assertThat(create("foo/bar/baz").subFragment(0, 0).getPathString()).isEqualTo("");
321 assertThat(create("foo/bar/baz").subFragment(1, 1).getPathString()).isEqualTo("");
322
323 assertThat(create("/foo/bar/baz").subFragment(0).getPathString()).isEqualTo("/foo/bar/baz");
324 assertThat(create("foo/bar/baz").subFragment(0).getPathString()).isEqualTo("foo/bar/baz");
325 assertThat(create("/foo/bar/baz").subFragment(1).getPathString()).isEqualTo("bar/baz");
326 assertThat(create("foo/bar/baz").subFragment(1).getPathString()).isEqualTo("bar/baz");
327 assertThat(create("foo/bar/baz").subFragment(2).getPathString()).isEqualTo("baz");
328 assertThat(create("foo/bar/baz").subFragment(3).getPathString()).isEqualTo("");
329
cushon978cb002018-02-24 14:05:37 -0800330 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800331 IndexOutOfBoundsException.class, () -> create("foo/bar/baz").subFragment(3, 2));
cushon978cb002018-02-24 14:05:37 -0800332 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800333 IndexOutOfBoundsException.class, () -> create("foo/bar/baz").subFragment(4, 4));
cushon978cb002018-02-24 14:05:37 -0800334 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800335 IndexOutOfBoundsException.class, () -> create("foo/bar/baz").subFragment(3, 2));
cushon978cb002018-02-24 14:05:37 -0800336 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800337 IndexOutOfBoundsException.class, () -> create("foo/bar/baz").subFragment(4));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100338 }
339
340 @Test
341 public void testStartsWith() {
tomlua729b9b2018-02-08 15:32:00 -0800342 PathFragment foobar = create("/foo/bar");
343 PathFragment foobarRelative = create("foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100344
345 // (path, prefix) => true
lberkiaea56b32017-05-30 12:35:33 +0200346 assertThat(foobar.startsWith(foobar)).isTrue();
tomlua729b9b2018-02-08 15:32:00 -0800347 assertThat(foobar.startsWith(create("/"))).isTrue();
348 assertThat(foobar.startsWith(create("/foo"))).isTrue();
349 assertThat(foobar.startsWith(create("/foo/"))).isTrue();
350 assertThat(foobar.startsWith(create("/foo/bar/"))).isTrue(); // Includes trailing slash.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100351
352 // (prefix, path) => false
tomlua729b9b2018-02-08 15:32:00 -0800353 assertThat(create("/foo").startsWith(foobar)).isFalse();
354 assertThat(create("/").startsWith(foobar)).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100355
356 // (absolute, relative) => false
lberkiaea56b32017-05-30 12:35:33 +0200357 assertThat(foobar.startsWith(foobarRelative)).isFalse();
358 assertThat(foobarRelative.startsWith(foobar)).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100359
360 // (relative path, relative prefix) => true
lberkiaea56b32017-05-30 12:35:33 +0200361 assertThat(foobarRelative.startsWith(foobarRelative)).isTrue();
tomlua729b9b2018-02-08 15:32:00 -0800362 assertThat(foobarRelative.startsWith(create("foo"))).isTrue();
363 assertThat(foobarRelative.startsWith(create(""))).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100364
365 // (path, sibling) => false
tomlua729b9b2018-02-08 15:32:00 -0800366 assertThat(create("/foo/wiz").startsWith(foobar)).isFalse();
367 assertThat(foobar.startsWith(create("/foo/wiz"))).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100368 }
369
370 @Test
Mark Schallerb8154322015-06-22 16:02:24 +0000371 public void testCheckAllPathsStartWithButAreNotEqualTo() {
372 // Check passes:
tomlua729b9b2018-02-08 15:32:00 -0800373 PathFragment.checkAllPathsAreUnder(toPathsSet("a/b", "a/c"), create("a"));
Mark Schallerb8154322015-06-22 16:02:24 +0000374
375 // Check trivially passes:
tomlua729b9b2018-02-08 15:32:00 -0800376 PathFragment.checkAllPathsAreUnder(ImmutableList.<PathFragment>of(), create("a"));
Mark Schallerb8154322015-06-22 16:02:24 +0000377
378 // Check fails when some path does not start with startingWithPath:
cushon978cb002018-02-24 14:05:37 -0800379 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800380 IllegalArgumentException.class,
381 () -> PathFragment.checkAllPathsAreUnder(toPathsSet("a/b", "b/c"), create("a")));
Mark Schallerb8154322015-06-22 16:02:24 +0000382
383 // Check fails when some path is equal to startingWithPath:
cushon978cb002018-02-24 14:05:37 -0800384 MoreAsserts.assertThrows(
tomlua729b9b2018-02-08 15:32:00 -0800385 IllegalArgumentException.class,
386 () -> PathFragment.checkAllPathsAreUnder(toPathsSet("a/b", "a"), create("a")));
Mark Schallerb8154322015-06-22 16:02:24 +0000387 }
388
389 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100390 public void testEndsWith() {
tomlua729b9b2018-02-08 15:32:00 -0800391 PathFragment foobar = create("/foo/bar");
392 PathFragment foobarRelative = create("foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100393
394 // (path, suffix) => true
lberkiaea56b32017-05-30 12:35:33 +0200395 assertThat(foobar.endsWith(foobar)).isTrue();
tomlua729b9b2018-02-08 15:32:00 -0800396 assertThat(foobar.endsWith(create("bar"))).isTrue();
397 assertThat(foobar.endsWith(create("foo/bar"))).isTrue();
398 assertThat(foobar.endsWith(create("/foo/bar"))).isTrue();
399 assertThat(foobar.endsWith(create("/bar"))).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100400
401 // (prefix, path) => false
tomlua729b9b2018-02-08 15:32:00 -0800402 assertThat(create("/foo").endsWith(foobar)).isFalse();
403 assertThat(create("/").endsWith(foobar)).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100404
405 // (suffix, path) => false
tomlua729b9b2018-02-08 15:32:00 -0800406 assertThat(create("/bar").endsWith(foobar)).isFalse();
407 assertThat(create("bar").endsWith(foobar)).isFalse();
408 assertThat(create("").endsWith(foobar)).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100409
410 // (absolute, relative) => true
lberkiaea56b32017-05-30 12:35:33 +0200411 assertThat(foobar.endsWith(foobarRelative)).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100412
413 // (relative, absolute) => false
lberkiaea56b32017-05-30 12:35:33 +0200414 assertThat(foobarRelative.endsWith(foobar)).isFalse();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100415
416 // (relative path, relative prefix) => true
lberkiaea56b32017-05-30 12:35:33 +0200417 assertThat(foobarRelative.endsWith(foobarRelative)).isTrue();
tomlua729b9b2018-02-08 15:32:00 -0800418 assertThat(foobarRelative.endsWith(create("bar"))).isTrue();
419 assertThat(foobarRelative.endsWith(create(""))).isTrue();
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100420
421 // (path, sibling) => false
tomlua729b9b2018-02-08 15:32:00 -0800422 assertThat(create("/foo/wiz").endsWith(foobar)).isFalse();
423 assertThat(foobar.endsWith(create("/foo/wiz"))).isFalse();
424 }
425
426 @Test
427 public void testToRelative() {
428 assertThat(create("/foo/bar").toRelative()).isEqualTo(create("foo/bar"));
429 assertThat(create("/").toRelative()).isEqualTo(create(""));
cushon978cb002018-02-24 14:05:37 -0800430 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> create("foo").toRelative());
tomlua729b9b2018-02-08 15:32:00 -0800431 }
432
433 @Test
434 public void testGetDriveStr() {
435 assertThat(create("/foo/bar").getDriveStr()).isEqualTo("/");
436 assertThat(create("/").getDriveStr()).isEqualTo("/");
cushon978cb002018-02-24 14:05:37 -0800437 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> create("foo").getDriveStr());
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100438 }
439
440 static List<PathFragment> toPaths(List<String> strs) {
441 List<PathFragment> paths = Lists.newArrayList();
442 for (String s : strs) {
tomlua729b9b2018-02-08 15:32:00 -0800443 paths.add(create(s));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100444 }
445 return paths;
446 }
447
Mark Schallerb8154322015-06-22 16:02:24 +0000448 static ImmutableSet<PathFragment> toPathsSet(String... strs) {
449 ImmutableSet.Builder<PathFragment> builder = ImmutableSet.builder();
450 for (String str : strs) {
tomlua729b9b2018-02-08 15:32:00 -0800451 builder.add(create(str));
Mark Schallerb8154322015-06-22 16:02:24 +0000452 }
453 return builder.build();
454 }
455
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100456 @Test
457 public void testCompareTo() throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800458 List<String> pathStrs =
459 ImmutableList.of(
460 "",
461 "/",
462 "foo",
463 "/foo",
464 "foo/bar",
465 "foo.bar",
466 "foo/bar.baz",
467 "foo/bar/baz",
468 "foo/barfile",
469 "foo/Bar",
470 "Foo/bar");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100471 List<PathFragment> paths = toPaths(pathStrs);
472 // First test that compareTo is self-consistent.
473 for (PathFragment x : paths) {
474 for (PathFragment y : paths) {
475 for (PathFragment z : paths) {
476 // Anti-symmetry
lberkiaea56b32017-05-30 12:35:33 +0200477 assertThat(-1 * Integer.signum(y.compareTo(x))).isEqualTo(Integer.signum(x.compareTo(y)));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100478 // Transitivity
479 if (x.compareTo(y) > 0 && y.compareTo(z) > 0) {
Googler2fa3ccf2015-11-10 14:30:39 +0000480 assertThat(x.compareTo(z)).isGreaterThan(0);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100481 }
482 // "Substitutability"
483 if (x.compareTo(y) == 0) {
lberkiaea56b32017-05-30 12:35:33 +0200484 assertThat(Integer.signum(y.compareTo(z))).isEqualTo(Integer.signum(x.compareTo(z)));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100485 }
486 // Consistency with equals
lberkiaea56b32017-05-30 12:35:33 +0200487 assertThat(x.equals(y)).isEqualTo((x.compareTo(y) == 0));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100488 }
489 }
490 }
tomlua729b9b2018-02-08 15:32:00 -0800491 // Now test that compareTo does what we expect. The exact ordering here doesn't matter much.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100492 Collections.shuffle(paths);
493 Collections.sort(paths);
tomlua729b9b2018-02-08 15:32:00 -0800494 List<PathFragment> expectedOrder =
495 toPaths(
496 ImmutableList.of(
497 "",
498 "/",
499 "/foo",
500 "Foo/bar",
501 "foo",
502 "foo.bar",
503 "foo/Bar",
504 "foo/bar",
505 "foo/bar.baz",
506 "foo/bar/baz",
507 "foo/barfile"));
lberkiaea56b32017-05-30 12:35:33 +0200508 assertThat(paths).isEqualTo(expectedOrder);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100509 }
510
511 @Test
512 public void testGetSafePathString() {
tomlua729b9b2018-02-08 15:32:00 -0800513 assertThat(create("/").getSafePathString()).isEqualTo("/");
514 assertThat(create("/abc").getSafePathString()).isEqualTo("/abc");
515 assertThat(create("").getSafePathString()).isEqualTo(".");
lberkiaea56b32017-05-30 12:35:33 +0200516 assertThat(PathFragment.EMPTY_FRAGMENT.getSafePathString()).isEqualTo(".");
tomlua729b9b2018-02-08 15:32:00 -0800517 assertThat(create("abc/def").getSafePathString()).isEqualTo("abc/def");
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100518 }
Michajlo Matijkiwbaf44c92016-06-23 21:54:05 +0000519
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100520 @Test
521 public void testNormalize() {
tomlua729b9b2018-02-08 15:32:00 -0800522 assertThat(create("/a/b")).isEqualTo(create("/a/b"));
523 assertThat(create("/a/./b")).isEqualTo(create("/a/b"));
524 assertThat(create("/a/../b")).isEqualTo(create("/b"));
525 assertThat(create("a/b")).isEqualTo(create("a/b"));
526 assertThat(create("a/../../b")).isEqualTo(create("../b"));
527 assertThat(create("a/../..")).isEqualTo(create(".."));
528 assertThat(create("a/../b")).isEqualTo(create("b"));
529 assertThat(create("a/b/../b")).isEqualTo(create("a/b"));
530 assertThat(create("/..")).isEqualTo(create("/.."));
531 assertThat(create("..")).isEqualTo(create(".."));
532 }
533
534 @Test
535 public void testSegments() {
536 assertThat(create("").segmentCount()).isEqualTo(0);
537 assertThat(create("a").segmentCount()).isEqualTo(1);
538 assertThat(create("a/b").segmentCount()).isEqualTo(2);
539 assertThat(create("a/b/c").segmentCount()).isEqualTo(3);
540 assertThat(create("/").segmentCount()).isEqualTo(0);
541 assertThat(create("/a").segmentCount()).isEqualTo(1);
542 assertThat(create("/a/b").segmentCount()).isEqualTo(2);
543 assertThat(create("/a/b/c").segmentCount()).isEqualTo(3);
544
545 assertThat(create("").getSegments()).isEmpty();
546 assertThat(create("a").getSegments()).containsExactly("a").inOrder();
547 assertThat(create("a/b").getSegments()).containsExactly("a", "b").inOrder();
548 assertThat(create("a/b/c").getSegments()).containsExactly("a", "b", "c").inOrder();
549 assertThat(create("/").getSegments()).isEmpty();
550 assertThat(create("/a").getSegments()).containsExactly("a").inOrder();
551 assertThat(create("/a/b").getSegments()).containsExactly("a", "b").inOrder();
552 assertThat(create("/a/b/c").getSegments()).containsExactly("a", "b", "c").inOrder();
553
554 assertThat(create("a").getSegment(0)).isEqualTo("a");
555 assertThat(create("a/b").getSegment(0)).isEqualTo("a");
556 assertThat(create("a/b").getSegment(1)).isEqualTo("b");
557 assertThat(create("a/b/c").getSegment(2)).isEqualTo("c");
558 assertThat(create("/a").getSegment(0)).isEqualTo("a");
559 assertThat(create("/a/b").getSegment(0)).isEqualTo("a");
560 assertThat(create("/a/b").getSegment(1)).isEqualTo("b");
561 assertThat(create("/a/b/c").getSegment(2)).isEqualTo("c");
562
cushon978cb002018-02-24 14:05:37 -0800563 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> create("").getSegment(0));
564 MoreAsserts.assertThrows(IllegalArgumentException.class, () -> create("a/b").getSegment(2));
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100565 }
566
567 @Test
Googler2258b812017-12-19 12:25:43 -0800568 public void testCodec() throws Exception {
shahan20f35b42018-02-28 15:57:33 -0800569 new SerializationTester(
Googler2258b812017-12-19 12:25:43 -0800570 ImmutableList.of("", "a", "/foo", "foo/bar/baz", "/a/path/fragment/with/lots/of/parts")
571 .stream()
572 .map(PathFragment::create)
573 .collect(toImmutableList()))
shahan20f35b42018-02-28 15:57:33 -0800574 .runTests();
Googler2258b812017-12-19 12:25:43 -0800575 }
576
577 @Test
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100578 public void testSerializationSimple() throws Exception {
579 checkSerialization("a", 91);
580 }
581
582 @Test
583 public void testSerializationAbsolute() throws Exception {
584 checkSerialization("/foo", 94);
585 }
586
587 @Test
588 public void testSerializationNested() throws Exception {
589 checkSerialization("foo/bar/baz", 101);
590 }
591
592 private void checkSerialization(String pathFragmentString, int expectedSize) throws Exception {
tomlua729b9b2018-02-08 15:32:00 -0800593 PathFragment a = create(pathFragmentString);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100594 byte[] sa = TestUtils.serializeObject(a);
lberkiaea56b32017-05-30 12:35:33 +0200595 assertThat(sa).hasLength(expectedSize);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100596
597 PathFragment a2 = (PathFragment) TestUtils.deserializeObject(sa);
lberkiaea56b32017-05-30 12:35:33 +0200598 assertThat(a2).isEqualTo(a);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100599 }
600}