// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gn/ninja_create_bundle_target_writer.h"

#include <algorithm>
#include <memory>
#include <sstream>

#include "gn/target.h"
#include "gn/test_with_scope.h"
#include "util/test/test.h"

namespace {

void SetupBundleDataDir(BundleData* bundle_data, const std::string& root_dir) {
  std::string bundle_root_dir = root_dir + "/bar.bundle";
  bundle_data->root_dir() = SourceDir(bundle_root_dir);
  bundle_data->contents_dir() = SourceDir(bundle_root_dir + "/Contents");
  bundle_data->resources_dir() =
      SourceDir(bundle_data->contents_dir().value() + "/Resources");
  bundle_data->executable_dir() =
      SourceDir(bundle_data->contents_dir().value() + "/MacOS");
}

std::unique_ptr<Target> NewAction(const TestWithScope& setup) {
  Err err;
  auto action = std::make_unique<Target>(setup.settings(),
                                         Label(SourceDir("//foo/"), "bar"));
  action->set_output_type(Target::ACTION);
  action->visibility().SetPublic();
  action->action_values().set_script(SourceFile("//foo/script.py"));

  action->action_values().outputs() =
      SubstitutionList::MakeForTest("//out/Debug/foo.out");

  action->SetToolchain(setup.toolchain());
  return action;
}

}  // namespace

// Tests multiple files with an output pattern.
TEST(NinjaCreateBundleTargetWriter, Run) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data.set_output_type(Target::BUNDLE_DATA);
  bundle_data.sources().push_back(SourceFile("//foo/input1.txt"));
  bundle_data.sources().push_back(SourceFile("//foo/input2.txt"));
  bundle_data.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data.SetToolchain(setup.toolchain());
  bundle_data.visibility().SetPublic();
  ASSERT_TRUE(bundle_data.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar.inputdeps: phony || phony/foo/bar "
      "phony/foo/data\n"
      "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
      "../../foo/input1.txt | phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
      "../../foo/input2.txt | phony/baz/bar.inputdeps\n"
      "build phony/baz/bar: phony "
      "bar.bundle/Contents/Resources/input1.txt "
      "bar.bundle/Contents/Resources/input2.txt\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests creating a bundle in a sub-directory of $root_out_dir.
TEST(NinjaCreateBundleTargetWriter, InSubDirectory) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data.set_output_type(Target::BUNDLE_DATA);
  bundle_data.sources().push_back(SourceFile("//foo/input1.txt"));
  bundle_data.sources().push_back(SourceFile("//foo/input2.txt"));
  bundle_data.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data.SetToolchain(setup.toolchain());
  bundle_data.visibility().SetPublic();
  ASSERT_TRUE(bundle_data.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug/gen");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar.inputdeps: phony || phony/foo/bar "
      "phony/foo/data\n"
      "build gen/bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
      "../../foo/input1.txt | phony/baz/bar.inputdeps\n"
      "build gen/bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
      "../../foo/input2.txt | phony/baz/bar.inputdeps\n"
      "build phony/baz/bar: phony "
      "gen/bar.bundle/Contents/Resources/input1.txt "
      "gen/bar.bundle/Contents/Resources/input2.txt\n"
      "build gen/bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests empty asset catalog with partial_info_plist property defined.
TEST(NinjaCreateBundleTargetWriter, JustPartialInfoPlist) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.bundle_data().product_type().assign("com.apple.product-type");
  create_bundle.bundle_data().set_partial_info_plist(
      SourceFile("//out/Debug/baz/bar/bar_partial_info.plist"));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build baz/bar/bar_partial_info.plist: stamp || phony/foo/bar\n"
      "build phony/baz/bar: phony "
      "baz/bar/bar_partial_info.plist || phony/foo/bar\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests multiple files from asset catalog.
TEST(NinjaCreateBundleTargetWriter, AssetCatalog) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data.set_output_type(Target::BUNDLE_DATA);
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/Contents.json"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.colorset/Contents.json"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/Contents.json"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29.png"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@2x.png"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@3x.png"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.dataset/Contents.json"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.dataset/FooScript.js"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/file/with/no/known/pattern"));
  bundle_data.sources().push_back(
      SourceFile("//foo/Foo.xcassets/nested/bar.xcassets/my/file"));
  bundle_data.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data.SetToolchain(setup.toolchain());
  bundle_data.visibility().SetPublic();
  ASSERT_TRUE(bundle_data.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.bundle_data().product_type().assign("com.apple.product-type");
  create_bundle.bundle_data().xcasset_compiler_flags() =
      SubstitutionList::MakeForTest("--app-icon", "foo");

  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar.inputdeps: phony || phony/foo/bar "
      "phony/foo/data\n"
      "build bar.bundle/Contents/Resources/Assets.car: compile_xcassets "
      "../../foo/Foo.xcassets | phony/foo/data phony/baz/bar.inputdeps\n"
      "  product_type = com.apple.product-type\n"
      "  xcasset_compiler_flags = --app-icon foo\n"
      "build phony/baz/bar: phony "
      "bar.bundle/Contents/Resources/Assets.car\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests that the phony target for the top-level bundle directory is generated
// correctly.
TEST(NinjaCreateBundleTargetWriter, PhonyTarget) {
  Err err;
  TestWithScope setup;

  // An action for our library to depend on.
  Target action(setup.settings(), Label(SourceDir("//foo/"), "action"));
  action.set_output_type(Target::ACTION_FOREACH);
  action.visibility().SetPublic();
  action.SetToolchain(setup.toolchain());
  ASSERT_TRUE(action.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(&action));
  create_bundle.SetToolchain(setup.toolchain());

  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar: phony || phony/foo/action\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests complex target with multiple bundle_data sources, including
// some asset catalog.
TEST(NinjaCreateBundleTargetWriter, Complex) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target bundle_data0(setup.settings(),
                      Label(SourceDir("//qux/"), "info_plist"));
  bundle_data0.set_output_type(Target::BUNDLE_DATA);
  bundle_data0.sources().push_back(SourceFile("//qux/qux-Info.plist"));
  bundle_data0.action_values().outputs() =
      SubstitutionList::MakeForTest("{{bundle_contents_dir}}/Info.plist");
  bundle_data0.SetToolchain(setup.toolchain());
  bundle_data0.visibility().SetPublic();
  ASSERT_TRUE(bundle_data0.OnResolved(&err));

  Target bundle_data1(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data1.set_output_type(Target::BUNDLE_DATA);
  bundle_data1.sources().push_back(SourceFile("//foo/input1.txt"));
  bundle_data1.sources().push_back(SourceFile("//foo/input2.txt"));
  bundle_data1.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data1.SetToolchain(setup.toolchain());
  bundle_data1.visibility().SetPublic();
  ASSERT_TRUE(bundle_data1.OnResolved(&err));

  Target bundle_data2(setup.settings(), Label(SourceDir("//foo/"), "assets"));
  bundle_data2.set_output_type(Target::BUNDLE_DATA);
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/Contents.json"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.colorset/Contents.json"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/Contents.json"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29.png"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@2x.png"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.imageset/FooIcon-29@3x.png"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.dataset/Contents.json"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/foo.dataset/FooScript.js"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/file/with/no/known/pattern"));
  bundle_data2.sources().push_back(
      SourceFile("//foo/Foo.xcassets/nested/bar.xcassets/my/file"));
  bundle_data2.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data2.SetToolchain(setup.toolchain());
  bundle_data2.visibility().SetPublic();
  ASSERT_TRUE(bundle_data2.OnResolved(&err));

  Target bundle_data3(setup.settings(), Label(SourceDir("//quz/"), "assets"));
  bundle_data3.set_output_type(Target::BUNDLE_DATA);
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/Contents.json"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.imageset/Contents.json"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29.png"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29@2x.png"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.imageset/QuzIcon-29@3x.png"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.dataset/Contents.json"));
  bundle_data3.sources().push_back(
      SourceFile("//quz/Quz.xcassets/quz.dataset/QuzScript.js"));
  bundle_data3.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data3.SetToolchain(setup.toolchain());
  bundle_data3.visibility().SetPublic();
  ASSERT_TRUE(bundle_data3.OnResolved(&err));

  Target bundle_data4(setup.settings(), Label(SourceDir("//biz/"), "assets"));
  bundle_data4.set_output_type(Target::BUNDLE_DATA);
  bundle_data4.sources().push_back(
      SourceFile("//biz/Biz.xcassets/Contents.json"));
  bundle_data4.sources().push_back(
      SourceFile("//biz/Biz.xcassets/biz.colorset/Contents.json"));
  bundle_data4.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data4.SetToolchain(setup.toolchain());
  bundle_data4.visibility().SetPublic();
  ASSERT_TRUE(bundle_data4.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data0));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data1));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data2));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data3));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data4));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.bundle_data().product_type().assign("com.apple.product-type");
  create_bundle.bundle_data().set_partial_info_plist(
      SourceFile("//out/Debug/baz/bar/bar_partial_info.plist"));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar.inputdeps: phony || phony/biz/assets "
      "phony/foo/assets phony/foo/bar phony/foo/data "
      "phony/qux/info_plist phony/quz/assets\n"
      "build bar.bundle/Contents/Info.plist: copy_bundle_data "
      "../../qux/qux-Info.plist | phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
      "../../foo/input1.txt | phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
      "../../foo/input2.txt | phony/baz/bar.inputdeps\n"
      "build phony/baz/bar.xcassets.inputdeps: phony "
      "phony/foo/assets "
      "phony/quz/assets phony/biz/assets\n"
      "build bar.bundle/Contents/Resources/Assets.car | "
      "baz/bar/bar_partial_info.plist: compile_xcassets "
      "../../foo/Foo.xcassets ../../quz/Quz.xcassets "
      "../../biz/Biz.xcassets | phony/baz/bar.xcassets.inputdeps "
      "phony/baz/bar.inputdeps\n"
      "  product_type = com.apple.product-type\n"
      "  partial_info_plist = baz/bar/bar_partial_info.plist\n"
      "build phony/baz/bar: phony "
      "bar.bundle/Contents/Info.plist "
      "bar.bundle/Contents/Resources/input1.txt "
      "bar.bundle/Contents/Resources/input2.txt "
      "bar.bundle/Contents/Resources/Assets.car "
      "baz/bar/bar_partial_info.plist\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

// Tests post-processing step.
TEST(NinjaCreateBundleTargetWriter, PostProcessing) {
  Err err;
  TestWithScope setup;

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target executable(setup.settings(), Label(SourceDir("//baz/"), "quz"));
  executable.set_output_type(Target::EXECUTABLE);
  executable.sources().push_back(SourceFile("//baz/quz.c"));
  executable.SetToolchain(setup.toolchain());
  executable.visibility().SetPublic();
  ASSERT_TRUE(executable.OnResolved(&err));

  Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data.set_output_type(Target::BUNDLE_DATA);
  bundle_data.sources().push_back(SourceFile("//foo/input1.txt"));
  bundle_data.sources().push_back(SourceFile("//foo/input2.txt"));
  bundle_data.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data.SetToolchain(setup.toolchain());
  bundle_data.visibility().SetPublic();
  ASSERT_TRUE(bundle_data.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.bundle_data().set_post_processing_script(
      SourceFile("//build/codesign.py"));
  create_bundle.bundle_data().post_processing_sources().push_back(
      SourceFile("//out/Debug/quz"));
  create_bundle.bundle_data().post_processing_outputs() =
      SubstitutionList::MakeForTest(
          "//out/Debug/bar.bundle/Contents/quz",
          "//out/Debug/bar.bundle/_CodeSignature/CodeResources");
  create_bundle.bundle_data().post_processing_args() =
      SubstitutionList::MakeForTest("-b=quz", "bar.bundle");
  create_bundle.public_deps().push_back(LabelTargetPair(&executable));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build phony/baz/bar.inputdeps: phony || ./quz phony/foo/bar "
      "phony/foo/data\n"
      "rule __baz_bar___toolchain_default__post_processing_rule\n"
      "  command =  ../../build/codesign.py -b=quz bar.bundle\n"
      "  description = POST PROCESSING //baz:bar(//toolchain:default)\n"
      "  restat = 1\n"
      "\n"
      "build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
      "../../foo/input1.txt | phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
      "../../foo/input2.txt | phony/baz/bar.inputdeps\n"
      "build phony/baz/bar.postprocessing.inputdeps: phony "
      "../../build/codesign.py "
      "quz "
      "bar.bundle/Contents/Resources/input1.txt "
      "bar.bundle/Contents/Resources/input2.txt | "
      "phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/quz bar.bundle/_CodeSignature/CodeResources: "
      "__baz_bar___toolchain_default__post_processing_rule "
      "| phony/baz/bar.postprocessing.inputdeps\n"
      "build phony/baz/bar: phony "
      "bar.bundle/Contents/quz "
      "bar.bundle/_CodeSignature/CodeResources ./quz\n"
      "build bar.bundle: phony phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}

TEST(NinjaCreateBundleTargetWriter, PostProcessingNoStampFilesCustomToolchain) {
  Err err;
  TestWithScope setup;
  setup.build_settings()->set_no_stamp_files(true);

  Label other_toolchain_label(SourceDir("//other/"), "toolchain");
  setup.settings()->set_toolchain_label(other_toolchain_label);

  std::unique_ptr<Target> action = NewAction(setup);
  ASSERT_TRUE(action->OnResolved(&err)) << err.message();

  Target executable(setup.settings(), Label(SourceDir("//baz/"), "quz"));
  executable.set_output_type(Target::EXECUTABLE);
  executable.sources().push_back(SourceFile("//baz/quz.c"));
  executable.SetToolchain(setup.toolchain());
  executable.visibility().SetPublic();
  ASSERT_TRUE(executable.OnResolved(&err));

  Target bundle_data(setup.settings(), Label(SourceDir("//foo/"), "data"));
  bundle_data.set_output_type(Target::BUNDLE_DATA);
  bundle_data.sources().push_back(SourceFile("//foo/input1.txt"));
  bundle_data.sources().push_back(SourceFile("//foo/input2.txt"));
  bundle_data.action_values().outputs() = SubstitutionList::MakeForTest(
      "{{bundle_resources_dir}}/{{source_file_part}}");
  bundle_data.SetToolchain(setup.toolchain());
  bundle_data.visibility().SetPublic();
  ASSERT_TRUE(bundle_data.OnResolved(&err));

  Target create_bundle(
      setup.settings(),
      Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
            setup.toolchain()->label().name()));
  SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
  create_bundle.set_output_type(Target::CREATE_BUNDLE);
  create_bundle.bundle_data().set_post_processing_script(
      SourceFile("//build/codesign.py"));
  create_bundle.bundle_data().post_processing_sources().push_back(
      SourceFile("//out/Debug/quz"));
  create_bundle.bundle_data().post_processing_outputs() =
      SubstitutionList::MakeForTest(
          "//out/Debug/bar.bundle/Contents/quz",
          "//out/Debug/bar.bundle/_CodeSignature/CodeResources");
  create_bundle.bundle_data().post_processing_args() =
      SubstitutionList::MakeForTest("-b=quz", "bar.bundle");
  create_bundle.public_deps().push_back(LabelTargetPair(&executable));
  create_bundle.private_deps().push_back(LabelTargetPair(&bundle_data));
  create_bundle.private_deps().push_back(LabelTargetPair(action.get()));
  create_bundle.SetToolchain(setup.toolchain());
  ASSERT_TRUE(create_bundle.OnResolved(&err));

  std::ostringstream out;
  NinjaCreateBundleTargetWriter writer(&create_bundle, out);
  writer.Run();

  const char expected[] =
      "build toolchain/phony/baz/bar.inputdeps: phony || ./quz "
      "toolchain/phony/foo/bar "
      "toolchain/phony/foo/data\n"
      "rule __baz_bar___toolchain_default__post_processing_rule\n"
      "  command =  ../../build/codesign.py -b=quz bar.bundle\n"
      "  description = POST PROCESSING //baz:bar(//toolchain:default)\n"
      "  restat = 1\n"
      "\n"
      "build bar.bundle/Contents/Resources/input1.txt: "
      "toolchain_copy_bundle_data "
      "../../foo/input1.txt | toolchain/phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/Resources/input2.txt: "
      "toolchain_copy_bundle_data "
      "../../foo/input2.txt | toolchain/phony/baz/bar.inputdeps\n"
      "build toolchain/phony/baz/bar.postprocessing.inputdeps: phony "
      "../../build/codesign.py "
      "quz "
      "bar.bundle/Contents/Resources/input1.txt "
      "bar.bundle/Contents/Resources/input2.txt | "
      "toolchain/phony/baz/bar.inputdeps\n"
      "build bar.bundle/Contents/quz bar.bundle/_CodeSignature/CodeResources: "
      "__baz_bar___toolchain_default__post_processing_rule "
      "| toolchain/phony/baz/bar.postprocessing.inputdeps\n"
      "build toolchain/phony/baz/bar: phony "
      "bar.bundle/Contents/quz "
      "bar.bundle/_CodeSignature/CodeResources ./quz\n"
      "build bar.bundle: phony toolchain/phony/baz/bar\n";
  std::string out_str = out.str();
  EXPECT_EQ(expected, out_str);
}
