/** * If the source paths specified contains one source path to a non-generated file then we should * return the correct source tmp corresponding to that non-generated source path. Especially when * the generated file comes first in the ordered set. */ @Test public void testMixedSourceFile() { Path pathToGenFile = GEN_PATH.resolve("com/facebook/GeneratedFile.java"); Path pathToNonGenFile1 = Paths.get("package/src/SourceFile1.java"); Path pathToNonGenFile2 = Paths.get("package/src-gen/SourceFile2.java"); ImmutableSortedSet<Path> javaSrcs = ImmutableSortedSet.of(pathToGenFile, pathToNonGenFile1, pathToNonGenFile2); DefaultJavaPackageFinder defaultJavaPackageFinder = createMock(DefaultJavaPackageFinder.class); expect(defaultJavaPackageFinder.getPathsFromRoot()).andReturn(pathsFromRoot).times(2); expect(defaultJavaPackageFinder.getPathElements()).andReturn(pathElements).times(2); JavaLibrary javaLibrary = new FakeJavaLibrary( BuildTarget.builder("//foo", "bar").build(), new SourcePathResolver(new BuildRuleResolver())) .setJavaSrcs(javaSrcs); replay(defaultJavaPackageFinder); ImmutableSet<String> result = TestRunning.getPathToSourceFolders( javaLibrary, Optional.of(defaultJavaPackageFinder), new FakeProjectFilesystem()); assertEquals( "The non-generated source files are under two different source folders.", ImmutableSet.of("./package/src-gen/", "./package/src/"), result); verify(defaultJavaPackageFinder); }
/** * If the source paths specified are all for non-generated files then we should return the correct * source tmp corresponding to a non-generated source path. */ @Test public void testNonGeneratedSourceFile() { Path pathToNonGenFile = Paths.get("package/src/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); expect(defaultJavaPackageFinder.getPathElements()).andReturn(pathElements); replay(defaultJavaPackageFinder); ImmutableSet<String> result = TestRunning.getPathToSourceFolders( javaLibrary, Optional.of(defaultJavaPackageFinder), new FakeProjectFilesystem()); assertEquals( "All non-generated source files are under one source tmp.", ImmutableSet.of("./package/src/"), result); verify(defaultJavaPackageFinder); }
/** * If the source paths specified contains one source path to a non-generated file then we should * return the correct source tmp corresponding to that non-generated source path. Especially when * the generated file comes first in the ordered set. */ @Test public void testMixedSourceFile() { String pathToGenFile = (GEN_DIR + "/com/facebook/GeneratedFile.java"); String pathToNonGenFile1 = ("package/src/SourceFile1.java"); String pathToNonGenFile2 = ("package/src-gen/SourceFile2.java"); ImmutableSortedSet<String> javaSrcs = ImmutableSortedSet.of(pathToGenFile, pathToNonGenFile1, pathToNonGenFile2); File parentFile1 = createMock(File.class); expect(parentFile1.getName()).andReturn("src"); expect(parentFile1.getPath()).andReturn("package/src"); File sourceFile1 = createMock(File.class); expect(sourceFile1.getParentFile()).andReturn(parentFile1); File parentFile2 = createMock(File.class); expect(parentFile2.getName()).andReturn("src"); expect(parentFile2.getPath()).andReturn("package/src-gen"); File sourceFile2 = createMock(File.class); expect(sourceFile2.getParentFile()).andReturn(parentFile2); DefaultJavaPackageFinder defaultJavaPackageFinder = createMock(DefaultJavaPackageFinder.class); expect(defaultJavaPackageFinder.getPathsFromRoot()).andReturn(pathsFromRoot).times(2); expect(defaultJavaPackageFinder.getPathElements()).andReturn(pathElements).times(2); ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class); expect(projectFilesystem.getFileForRelativePath(pathToNonGenFile1)).andReturn(sourceFile1); expect(projectFilesystem.getFileForRelativePath(pathToNonGenFile2)).andReturn(sourceFile2); JavaLibraryRule javaLibraryRule = new FakeJavaLibraryRule(new BuildTarget("//foo", "bar")).setJavaSrcs(javaSrcs); Object[] mocks = new Object[] { parentFile1, sourceFile1, parentFile2, sourceFile2, defaultJavaPackageFinder, projectFilesystem }; replay(mocks); ImmutableSet<String> result = TestCommand.getPathToSourceFolders( javaLibraryRule, Optional.of(defaultJavaPackageFinder), projectFilesystem); assertEquals( "The non-generated source files are under two different source folders.", ImmutableSet.of("package/src-gen/", "package/src/"), result); verify(mocks); }
/** * If the source paths specified are all for non-generated files then we should return the correct * source tmp corresponding to a non-generated source path. */ @Test public void testNonGeneratedSourceFile() { String pathToNonGenFile = "package/src/SourceFile1.java"; assertFalse(JavaTestRule.isGeneratedFile(pathToNonGenFile)); ImmutableSortedSet<String> javaSrcs = ImmutableSortedSet.of(pathToNonGenFile); JavaLibraryRule javaLibraryRule = new FakeJavaLibraryRule(new BuildTarget("//foo", "bar")).setJavaSrcs(javaSrcs); File parentFile = createMock(File.class); expect(parentFile.getName()).andReturn("src"); expect(parentFile.getPath()).andReturn("package/src"); File sourceFile = createMock(File.class); expect(sourceFile.getParentFile()).andReturn(parentFile); DefaultJavaPackageFinder defaultJavaPackageFinder = createMock(DefaultJavaPackageFinder.class); expect(defaultJavaPackageFinder.getPathsFromRoot()).andReturn(pathsFromRoot); expect(defaultJavaPackageFinder.getPathElements()).andReturn(pathElements); ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class); expect(projectFilesystem.getFileForRelativePath(pathToNonGenFile)).andReturn(sourceFile); Object[] mocks = new Object[] {parentFile, sourceFile, defaultJavaPackageFinder, projectFilesystem}; replay(mocks); ImmutableSet<String> result = TestCommand.getPathToSourceFolders( javaLibraryRule, Optional.of(defaultJavaPackageFinder), projectFilesystem); assertEquals( "All non-generated source files are under one source tmp.", ImmutableSet.of("package/src/"), result); 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); }