/** * If the source paths specified are from the new unified source tmp then we should return the * correct source tmp corresponding to the unified source path. */ @Test public void testUnifiedSourceFile() { Path pathToNonGenFile = Paths.get("java/package/SourceFile1.java"); assertFalse(MorePaths.isGeneratedFile(pathToNonGenFile)); ImmutableSortedSet<Path> javaSrcs = ImmutableSortedSet.of(pathToNonGenFile); JavaLibrary javaLibrary = new FakeJavaLibrary( BuildTarget.builder("//foo", "bar").build(), new SourcePathResolver(new BuildRuleResolver())) .setJavaSrcs(javaSrcs); DefaultJavaPackageFinder defaultJavaPackageFinder = createMock(DefaultJavaPackageFinder.class); expect(defaultJavaPackageFinder.getPathsFromRoot()).andReturn(pathsFromRoot); Object[] mocks = new Object[] {defaultJavaPackageFinder}; replay(mocks); ImmutableSet<String> result = TestRunning.getPathToSourceFolders( javaLibrary, Optional.of(defaultJavaPackageFinder), new FakeProjectFilesystem()); assertEquals( "All non-generated source files are under one source tmp.", ImmutableSet.of("java/"), result); verify(mocks); }
/** * If the source paths specified are all generated files, then our path to source tmp should be * absent. */ @Test public void testGeneratedSourceFile() { Path pathToGenFile = GEN_PATH.resolve("GeneratedFile.java"); assertTrue(MorePaths.isGeneratedFile(pathToGenFile)); ImmutableSortedSet<Path> javaSrcs = ImmutableSortedSet.of(pathToGenFile); JavaLibrary javaLibrary = new FakeJavaLibrary( BuildTarget.builder("//foo", "bar").build(), new SourcePathResolver(new BuildRuleResolver())) .setJavaSrcs(javaSrcs); DefaultJavaPackageFinder defaultJavaPackageFinder = createMock(DefaultJavaPackageFinder.class); Object[] mocks = new Object[] {defaultJavaPackageFinder}; replay(mocks); ImmutableSet<String> result = TestRunning.getPathToSourceFolders( javaLibrary, Optional.of(defaultJavaPackageFinder), new FakeProjectFilesystem()); assertTrue( "No path should be returned if the library contains only generated files.", result.isEmpty()); verify(mocks); }
/** Returns a set of source folders of the java files of a library. */ @VisibleForTesting static ImmutableSet<String> getPathToSourceFolders( JavaLibrary rule, Optional<DefaultJavaPackageFinder> defaultJavaPackageFinderOptional, ProjectFilesystem filesystem) { ImmutableSet<Path> javaSrcs = rule.getJavaSrcs(); // A Java library rule with just resource files has an empty javaSrcs. if (javaSrcs.isEmpty()) { return ImmutableSet.of(); } // If defaultJavaPackageFinderOptional is not present, then it could mean that there was an // error reading from the buck configuration file. if (!defaultJavaPackageFinderOptional.isPresent()) { throw new HumanReadableException( "Please include a [java] section with src_root property in the .buckconfig file."); } DefaultJavaPackageFinder defaultJavaPackageFinder = defaultJavaPackageFinderOptional.get(); // Iterate through all source paths to make sure we are generating a complete set of source // folders for the source paths. Set<String> srcFolders = Sets.newHashSet(); loopThroughSourcePath: for (Path javaSrcPath : javaSrcs) { if (!MorePaths.isGeneratedFile(javaSrcPath)) { // If the source path is already under a known source folder, then we can skip this // source path. for (String srcFolder : srcFolders) { if (javaSrcPath.startsWith(srcFolder)) { continue loopThroughSourcePath; } } // If the source path is under one of the source roots, then we can just add the source // root. ImmutableSortedSet<String> pathsFromRoot = defaultJavaPackageFinder.getPathsFromRoot(); for (String root : pathsFromRoot) { if (javaSrcPath.startsWith(root)) { srcFolders.add(root); continue loopThroughSourcePath; } } // Traverse the file system from the parent directory of the java file until we hit the // parent of the src root directory. ImmutableSet<String> pathElements = defaultJavaPackageFinder.getPathElements(); File directory = filesystem.getFileForRelativePath(javaSrcPath.getParent()); while (directory != null && !pathElements.contains(directory.getName())) { directory = directory.getParentFile(); } if (directory != null) { String directoryPath = directory.getPath(); if (!directoryPath.endsWith("/")) { directoryPath += "/"; } srcFolders.add(directoryPath); } } } return ImmutableSet.copyOf(srcFolders); }