/* * Copyright 2015-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.apple.xcode; import static org.junit.Assume.assumeTrue; import com.facebook.buck.apple.AppleNativeIntegrationTestUtils; import com.facebook.buck.apple.ApplePlatform; import com.facebook.buck.testutil.integration.BuckBuildLog; import com.facebook.buck.testutil.integration.ProjectWorkspace; import com.facebook.buck.testutil.integration.TemporaryPaths; import com.facebook.buck.testutil.integration.TestDataHelper; import com.facebook.buck.util.HumanReadableException; import com.facebook.buck.util.environment.Platform; import java.io.IOException; import java.nio.file.Files; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class ProjectIntegrationTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Rule public TemporaryPaths temporaryFolder = new TemporaryPaths(); @Before public void setUp() { assumeTrue(Platform.detect() == Platform.MACOS || Platform.detect() == Platform.LINUX); } @Test public void testBuckProjectGeneratedSchemeOnlyIncludesDependenciesWithoutTests() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_generated_scheme_only_includes_dependencies", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "--without-tests", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectGeneratedSchemeIncludesTestsAndDependencies() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_generated_scheme_includes_tests_and_dependencies", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectGeneratedSchemeIncludesTestsAndDependenciesInADifferentBuckFile() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_generated_scheme_includes_tests_and_dependencies_in_a_different_buck_file", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectGeneratedSchemesDoNotIncludeOtherTests() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_generated_schemes_do_not_include_other_tests", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project"); result.assertSuccess(); workspace.verify(); } @Test public void generatingAllWorkspacesWillNotIncludeAllProjectsInEachOfThem() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "generating_all_workspaces_will_not_include_all_projects_in_each_of_them", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project"); result.assertSuccess(); workspace.verify(); } @Test public void schemeWithActionConfigNames() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "scheme_with_action_config_names", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project"); result.assertSuccess(); workspace.verify(); } @Test public void schemeWithExtraTests() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "scheme_with_extra_tests", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project"); result.assertSuccess(); workspace.verify(); } @Test public void schemeWithExtraTestsWithoutSrcTarget() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "scheme_with_extra_tests_without_src_target", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project"); result.assertSuccess(); workspace.verify(); } @Test public void generatingCombinedProject() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "generating_combined_project", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand( "project", "--combined-project", "--without-tests", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void generatingRootDirectoryProject() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "generating_root_directory_project", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//:bundle"); result.assertSuccess(); workspace.verify(); } @Test public void generatingCombinedProjectWithTests() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "generating_combined_project_with_tests", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "--combined-project", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testGeneratesWorkspaceFromBundle() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_implicit_workspace_generation", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//bin:app"); result.assertSuccess(); Files.exists(workspace.resolve("bin/app.xcworkspace/contents.xcworkspacedata")); Files.exists(workspace.resolve("bin/bin.xcodeproj/project.pbxproj")); } @Test public void testGeneratesWorkspaceFromLibrary() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_implicit_workspace_generation", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//lib:lib"); result.assertSuccess(); Files.exists(workspace.resolve("lib/lib.xcworkspace/contents.xcworkspacedata")); Files.exists(workspace.resolve("lib/lib.xcodeproj/project.pbxproj")); } @Test public void testGeneratesWorkspaceFromBinary() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_implicit_workspace_generation", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//bin:bin"); result.assertSuccess(); Files.exists(workspace.resolve("bin/bin.xcworkspace/contents.xcworkspacedata")); Files.exists(workspace.resolve("bin/bin.xcodeproj/project.pbxproj")); } @Test public void testAttemptingToGenerateWorkspaceFromResourceTargetIsABuildError() throws IOException { thrown.expect(HumanReadableException.class); thrown.expectMessage( "//res:res must be a xcode_workspace_config, apple_binary, apple_bundle, or apple_library"); ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_implicit_workspace_generation", temporaryFolder); workspace.setUp(); workspace.runBuckCommand("project", "//res:res"); } @Test public void testGeneratingProjectWithTargetUsingGenruleSourceBuildsGenrule() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "target_using_genrule_source", temporaryFolder); workspace.setUp(); workspace.runBuckCommand("project", "//lib:lib"); BuckBuildLog buildLog = workspace.getBuildLog(); buildLog.assertTargetBuiltLocally("//lib:gen"); buildLog.assertTargetBuiltLocally("other_cell//:gen"); } @Test public void testGeneratingProjectWithGenruleResourceBuildsGenrule() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "target_using_genrule_resource", temporaryFolder); workspace.setUp(); workspace.runBuckCommand("project", "//app:TestApp"); BuckBuildLog buildLog = workspace.getBuildLog(); buildLog.assertTargetBuiltLocally("//app:GenResource"); } @Test public void testBuckProjectBuckConfigWithoutTestsGenerate() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_buckconfig_without_tests_generate", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectBuckConfigWithoutTestsGenerateWithTests() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_buckconfig_without_tests_generate_with_tests", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "--with-tests", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectFocus() throws IOException { assumeTrue(Platform.detect() == Platform.MACOS); assumeTrue( AppleNativeIntegrationTestUtils.isApplePlatformAvailable(ApplePlatform.IPHONESIMULATOR)); ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario(this, "project_focus", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand( "project", "--focus", "//Libraries/Dep1:Dep1_1#iphonesimulator-x86_64 //Libraries/Dep2:Dep2", "//Apps:TestApp#iphonesimulator-x86_64"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectFocusPattern() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_focus_pattern", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "--focus", "//Libraries/Dep1:", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } @Test public void testBuckProjectFocusPatternCell() throws IOException { ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario( this, "project_focus_pattern_cell", temporaryFolder); workspace.setUp(); ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("project", "--focus", "bar//Dep2:", "//Apps:workspace"); result.assertSuccess(); workspace.verify(); } }