Пример #1
0
        public void NoArchivesOrTargets()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);

            var log     = new MSBuildTestLogger();
            var success = BuildProject(engine, project, "_XamarinBuildDownload", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);
        }
Пример #2
0
        public void TestGetPartialZipItemsToDownload()
        {
            var itemUrl = "https://dl-ssl.google.com/android/repository/android_m2repository_r40.zip";

            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);

            prel.AddItem(
                "XamarinBuildDownloadPartialZip", "androidsupport-25.0.1/cardview.v7", new Dictionary <string, string> {
                { "Url", itemUrl },
                { "ToFile", "cardview.v7.aar" },
                { "RangeStart", "196438127" },
                { "RangeEnd", "196460160" },
                { "Md5", "b44eb88f7cc621ae616744c6646f5b64" }
            });

            prel.AddItem(
                "XamarinBuildDownloadPartialZip", "androidsupport-25.0.1/recyclerview.v7", new Dictionary <string, string> {
                { "Url", itemUrl },
                { "ToFile", "recyclerview.v7.aar" },
                { "RangeStart", "199278205" },
                { "RangeEnd", "199589731" },
                { "Md5", "9be3f5e09877f1f308037659cb2a7636" }
            });

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "XamarinBuildDownloadGetItemsToDownload", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);

            var itemToDownload = project.GetItems("XamarinBuildDownloadItemToDownload");

            Assert.IsTrue(itemToDownload.Count == 2);
            Assert.IsTrue(itemToDownload.First().GetMetadata("Url").EvaluatedValue == itemUrl);
        }
Пример #3
0
        public void InvalidArchiveMetadata()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);

            prel.AddItem("XamarinBuildDownload", "-----");

            prel.AddItem(
                "XamarinBuildDownload", "foo-1.2", new Dictionary <string, string> {
            });

            prel.AddItem(
                "XamarinBuildDownload", "bar-1.9", new Dictionary <string, string> {
                { "Url", "https://www.example.com/bar.zip" },
                { "Kind", "Cabbage" }
            });

            prel.AddItem(
                "XamarinBuildDownload", "baz-1.9", new Dictionary <string, string> {
                { "Url", "https://www.example.com/bar.unknown" }
            });

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "_XamarinBuildDownload", log);

            var errors = log.Errors.Select(e => e.Message).ToList();

            Assert.AreEqual(4, errors.Count);
            Assert.AreEqual("Invalid item ID -----", errors[0]);
            Assert.AreEqual("Unknown archive kind 'Cabbage' for 'https://www.example.com/bar.zip'", errors[1]);
            Assert.AreEqual("Unknown archive kind '' for 'https://www.example.com/bar.unknown'", errors[2]);
            Assert.AreEqual("Missing required Url metadata on item foo-1.2", errors[3]);

            Assert.IsFalse(success);
        }
Пример #4
0
        public void TestAllowUnsafeGetItemsToDownload()
        {
            var itemUrl = "http://search.maven.org/remotecontent?filepath=com/facebook/android/facebook-android-sdk/4.17.0/facebook-android-sdk-4.17.0.aar";
            var zipUrl  = "http://dl-ssl.google.com/android/repository/android_m2repository_r40.zip";

            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("XamarinBuildDownloadAllowUnsecure", "true");

            prel.AddItem(
                "XamarinBuildDownload", "FacebookAndroid-4.17.0", new Dictionary <string, string> {
                { "Url", itemUrl },
                { "Kind", "Uncompressed" },
            });

            prel.AddItem(
                "XamarinBuildDownloadPartialZip", "androidsupport-25.0.1/cardview.v7", new Dictionary <string, string> {
                { "Url", zipUrl },
                { "ToFile", "cardview.v7.aar" },
                { "RangeStart", "196438127" },
                { "RangeEnd", "196460160" },
                { "Md5", "b44eb88f7cc621ae616744c6646f5b64" }
            });

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "XamarinBuildDownloadGetItemsToDownload", log);

            var itemToDownload = project.GetItems("XamarinBuildDownloadItemToDownload");

            Assert.AreEqual(2, itemToDownload.Count);
            Assert.IsTrue(itemToDownload.Any(i => i.GetMetadata("Url").EvaluatedValue == itemUrl));
            Assert.IsTrue(itemToDownload.Any(i => i.GetMetadata("Url").EvaluatedValue == zipUrl));
        }
Пример #5
0
        public void TestDeduplicateGetItemsToDownload()
        {
            var itemUrl = "http://search.maven.org/remotecontent?filepath=com/facebook/android/facebook-android-sdk/4.17.0/facebook-android-sdk-4.17.0.aar";

            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);

            prel.AddItem(
                "XamarinBuildDownload", "FacebookAndroid-4.17.0", new Dictionary <string, string> {
                { "Url", itemUrl },
                { "Kind", "Uncompressed" },
            });

            prel.AddItem(
                "XamarinBuildDownload", "FacebookAndroid-4.17.0", new Dictionary <string, string> {
                { "Url", itemUrl },
                { "Kind", "Uncompressed" },
            });

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "XamarinBuildDownloadGetItemsToDownload", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);

            var itemToDownload = project.GetItems("XamarinBuildDownloadItemToDownload");

            Assert.IsTrue(itemToDownload.Count == 1);
            Assert.IsTrue(itemToDownload.First().GetMetadata("Url").EvaluatedValue == itemUrl);
        }
Пример #6
0
        public void TestAndroidAarManifestFixup()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var intermediateDir = Path.Combine(TempDir, "obj");

            var asm = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition("Xamarin.GooglePlayServices.Auth", new System.Version(1, 0, 0, 0)),
                "Main",
                ModuleKind.Dll
                );
            var dll = Path.Combine(TempDir, "Xamarin.GooglePlayServices.Auth.dll");

            asm.Write(dll);
            prel.AddItem("ReferencePath", dll);

            var originalAsmDate = File.GetLastWriteTimeUtc(dll);


            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("TargetFrameworkIdentifier", "MonoAndroid");
            prel.SetProperty("TargetFrameworkVersion", "v7.0");
            prel.SetProperty("OutputType", "Exe");
            prel.SetProperty("IntermediateOutputPath", intermediateDir);

            prel.AddItem(
                "XamarinBuildDownloadPartialZip", "playservices-10.2.1/playservicesauth", new Dictionary <string, string> {
                { "Url", "https://dl-ssl.google.com/android/repository/google_m2repository_gms_v9_1_rc07_wear_2_0_1_rc3.zip" },
                { "ToFile", "play-services-auth-10.2.1.aar" },
                { "RangeStart", "12694130" },
                { "RangeEnd", "12770642" },
                { "Md5", "f4d814a0a434c09577a9b5a9d62da1f6" }
            });


            const string resourceName = "__AndroidLibraryProjects__.zip";
            var          aarPath      = "$(XamarinBuildDownloadDir)playservices-10.2.1\\playservicesauth\\play-services-auth-10.2.1.aar";

            prel.AddItem(
                "XamarinBuildDownloadRestoreAssemblyAar",
                aarPath,
                new Dictionary <string, string> {
                { "AssemblyName", "Xamarin.GooglePlayServices.Auth, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" },
                { "LogicalName", resourceName }
            }
                );

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "_XamarinAndroidBuildAarRestore", log);

            Assert.IsTrue(success);

            //check the assembly has the processed resource
            var processedAsm = AssemblyDefinition.ReadAssembly(dll);
            var resource     = processedAsm.MainModule.Resources.FirstOrDefault() as EmbeddedResource;

            Assert.NotNull(resource);
            Assert.AreEqual(resourceName, resource.Name);

            // Check the embedded .aar to see if all the manifest entries were fixed up
            using (var zip = new ZipArchive(resource.GetResourceStream())) {
                var manifestEntry = zip.Entries.FirstOrDefault(ze => ze.Name.EndsWith("AndroidManifest.xml", StringComparison.OrdinalIgnoreCase));

                Assert.IsNotNull(manifestEntry);

                // android: namespace
                XNamespace xns = "http://schemas.android.com/apk/res/android";

                using (var xmlReader = System.Xml.XmlReader.Create(manifestEntry.Open())) {
                    var xdoc = XDocument.Load(xmlReader);

                    var anyUnfixed = xdoc.Document.Descendants()
                                     .Any(elem => elem.Attribute(xns + "name")?.Value?.StartsWith(".", StringComparison.Ordinal) ?? false);

                    Assert.IsFalse(anyUnfixed);
                }
            }
        }
Пример #7
0
        public void TestAndroidAarResourceMergeModifyInPlaceAndStampFile()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var intermediateDir = Path.Combine(TempDir, "obj");

            var asm = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition("Xamarin.Android.Support.v7.CardView", new System.Version(1, 0, 0, 0)),
                "Main",
                ModuleKind.Dll
                );
            var dll = Path.Combine(TempDir, "Xamarin.Android.Support.v7.CardView.dll");

            asm.Write(dll);
            prel.AddItem("ReferencePath", dll);

            var originalAsmDate = File.GetLastWriteTimeUtc(dll);


            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("TargetFrameworkIdentifier", "MonoAndroid");
            prel.SetProperty("TargetFrameworkVersion", "v7.0");
            prel.SetProperty("OutputType", "Exe");
            prel.SetProperty("IntermediateOutputPath", intermediateDir);

            prel.AddItem(
                "XamarinBuildDownloadPartialZip", "androidsupport-25.0.0/cardview.v7", new Dictionary <string, string> {
                { "Url", "https://dl-ssl.google.com/android/repository/android_m2repository_r40.zip" },
                { "ToFile", "cardview.v7.aar" },
                { "RangeStart", "196438127" },
                { "RangeEnd", "196460160" },
                { "Md5", "b44eb88f7cc621ae616744c6646f5b64" }
            });


            const string resourceName = "__AndroidLibraryProjects__.zip";
            var          aarPath      = "$(XamarinBuildDownloadDir)androidsupport-25.0.0\\cardview.v7\\cardview.v7.aar";

            prel.AddItem(
                "XamarinBuildDownloadRestoreAssemblyAar",
                aarPath,
                new Dictionary <string, string> {
                { "AssemblyName", "Xamarin.Android.Support.v7.CardView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" },
                { "LogicalName", resourceName }
            }
                );

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            //var success = BuildProject (engine, project, "_XamarinBuildDownload", log);
            var success = BuildProject(engine, project, "_XamarinAndroidBuildAarRestore", log);

//			AssertNoMessagesOrWarnings (log);
            Assert.IsTrue(success);
            //Assert.IsTrue (File.Exists (Path.Combine (unpackDir, "androidsupport-25.0.1", "cardview.v7", "cardview.v7.aar")));

            success = BuildProject(engine, project, "_XamarinAndroidBuildAarRestore", log);

            Assert.IsTrue(File.Exists(Path.Combine(intermediateDir, "XbdMerge", "Xamarin.Android.Support.v7.CardView.dll.stamp")));

            Assert.IsTrue(File.GetLastWriteTimeUtc(dll) > originalAsmDate);
        }
Пример #8
0
        public void testAndroidAarAdded(bool useAndroidSdk)
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var asm = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition("Xamarin.Android.Support.v7.CardView", new System.Version(1, 0, 0, 0)),
                "Main",
                ModuleKind.Dll
                );
            var dll = Path.Combine(TempDir, "Xamarin.Android.Support.v7.CardView.dll");

            asm.Write(dll);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("TargetFrameworkIdentifier", "MonoAndroid");
            prel.SetProperty("TargetFrameworkVersion", "v7.0");

            var aarPathInSdk = "$(AndroidSdkPath)\\extras\\android\\m2repository\\com\\android\\support\\cardview-v7\\25.0.0\\cardview-v7-25.0.0.aar";

            if (useAndroidSdk)
            {
                prel.SetProperty("AndroidSdkPath", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Library", "Developer", "Xamarin", "android-sdk-mac_x86"));
            }

            prel.SetProperty("OutputType", "Exe");
            prel.SetProperty("IntermediateOutputPath", Path.Combine(TempDir, "obj"));

            var item = prel.AddItem(
                "XamarinBuildDownload", "androidsupport-25.0.0", new Dictionary <string, string> {
                { "Url", "https://dl-ssl.google.com/android/repository/android_m2repository_r39.zip" },
                { "Kind", "Zip" },
                { "Sha1", "89ad37d67a1018c42be36933cec3d7712141d42c" },
            });

            if (useAndroidSdk)
            {
                item.Condition = "!Exists('" + aarPathInSdk + "')";
            }

            prel.AddItem(
                "ReferencePath",
                dll
                );

            const string resourceName = "__AndroidLibraryProjects__.zip";
            var          aarPath      = "$(XamarinBuildDownloadDir)androidsupport-25.0.0\\m2repository\\com\\android\\support\\cardview-v7\\25.0.0\\cardview-v7-25.0.0.aar";

            prel.AddItem(
                "XamarinBuildDownloadRestoreAssemblyAar",
                useAndroidSdk ? aarPathInSdk : aarPath,
                new Dictionary <string, string> {
                { "AssemblyName", "Xamarin.Android.Support.v7.CardView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" },
                { "LogicalName", resourceName }
            }
                );

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            log.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic;

            var success = BuildProject(engine, project, "_XamarinAndroidBuildAarRestore", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);

            //Assert.IsTrue (File.Exists (aar));

            //check the referencepath has been replaced by the processed one
            var items = project.GetItems("ReferencePath");

            var mergedItem = items.FirstOrDefault(i => !string.IsNullOrEmpty(i.EvaluatedInclude) && i.EvaluatedInclude != dll);

            Assert.IsTrue(mergedItem != null);

            var itemPath = mergedItem.EvaluatedInclude;

            //check the assembly has the processed resource
            var processedAsm = AssemblyDefinition.ReadAssembly(itemPath);
            var resource     = processedAsm.MainModule.Resources.FirstOrDefault() as EmbeddedResource;

            Assert.NotNull(resource);
            Assert.AreEqual(resourceName, resource.Name);

            // Check that the embedded .aar has an appropriate prefix for each entry's path
            var hasWrongEntryNames = false;

            using (var zip = new ZipArchive(resource.GetResourceStream())) {
                hasWrongEntryNames = zip.Entries.Any(ze => !ze.FullName.StartsWith("library_project_imports", System.StringComparison.InvariantCulture));
            }
            Assert.IsFalse(hasWrongEntryNames);

            var processedAsmMtime = File.GetLastWriteTime(itemPath);

            // check incremental build works
            project       = new ProjectInstance(prel);
            log           = new MSBuildTestLogger();
            log.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic;
            var newSuccess = BuildProject(engine, project, "_XamarinAndroidBuildAarRestore", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(newSuccess);

            var newItems = project.GetItems("ReferencePath");
            var newItem  = newItems.FirstOrDefault(i => !string.IsNullOrEmpty(i.EvaluatedInclude) && i.EvaluatedInclude != dll);

            Assert.IsTrue(newItem != null);
            var newItemPath = newItem.EvaluatedInclude;

            Assert.AreEqual(itemPath, newItemPath);
            Assert.AreEqual(processedAsmMtime, File.GetLastWriteTime(newItemPath));
        }
Пример #9
0
        public void TestResourcesAdded()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var asm = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition("Foo", new System.Version(1, 0, 0, 0)),
                "Main",
                ModuleKind.Dll
                );
            var dll = Path.Combine(TempDir, "Foo.dll");

            asm.Write(dll);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("TargetFrameworkIdentifier", "Xamarin.iOS");
            prel.SetProperty("OutputType", "Exe");
            prel.SetProperty("IntermediateOutputPath", Path.Combine(TempDir, "obj"));

            prel.AddItem(
                "XamarinBuildDownload", "AppInvites-1.0.2", new Dictionary <string, string> {
                { "Url", "https://www.gstatic.com/cpdc/278f79fcd3b365e3-AppInvites-1.0.2.tar.gz" },
                { "Kind", "Tgz" }
            });

            prel.AddItem(
                "ReferencePath",
                dll
                );

            var plist = Path.Combine(unpackDir, "AppInvites-1.0.2", "Frameworks", "GINInvite.framework", "Versions", "A", "Resources", "GINInviteResources.bundle", "Info.plist");

            const string resourceName = "monotouch_content_GINInviteResources.bundle_fInfo.plist";

            prel.AddItem(
                "RestoreAssemblyResource",
                plist,
                new Dictionary <string, string> {
                { "AssemblyName", "Foo" },
                { "LogicalName", resourceName }
            }
                );

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "_XamariniOSBuildResourceRestore", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);

            Assert.IsTrue(File.Exists(plist));

            //check the referencepath has been replaced by the processed one
            var items = project.GetItems("ReferencePath");

            var mergedItem = items.FirstOrDefault(i => !string.IsNullOrEmpty(i.EvaluatedInclude) && i.EvaluatedInclude != dll);

            Assert.IsTrue(mergedItem != null);

            var itemPath = mergedItem.EvaluatedInclude;

            Assert.AreNotEqual(dll, itemPath);

            //check the assembly has the processed resource
            var processedAsm = AssemblyDefinition.ReadAssembly(itemPath);
            var resource     = processedAsm.MainModule.Resources.FirstOrDefault() as EmbeddedResource;

            Assert.NotNull(resource);
            Assert.AreEqual(resourceName, resource.Name);
            var ps = PObject.FromStream(resource.GetResourceStream()) as PDictionary;

            Assert.IsFalse(ps.ContainsKey("CFBundleExecutable"));
            Assert.Greater(ps.Count, 0);
            var processedAsmMtime = File.GetLastWriteTime(itemPath);

            // check incremental build works
            project = new ProjectInstance(prel);
            log     = new MSBuildTestLogger();
            var newSuccess = BuildProject(engine, project, "_XamariniOSBuildResourceRestore", log);

            AssertNoMessagesOrWarnings(log);
            Assert.IsTrue(success);

            var newItems    = project.GetItems("ReferencePath");
            var newItem     = newItems.FirstOrDefault(i => !string.IsNullOrEmpty(i.EvaluatedInclude) && i.EvaluatedInclude != dll);
            var newItemPath = newItem.EvaluatedInclude;

            Assert.AreEqual(itemPath, newItemPath);
            Assert.AreEqual(processedAsmMtime, File.GetLastWriteTime(newItemPath));
        }
Пример #10
0
        public void TestCastAssemblyResources()
        {
            var engine = new ProjectCollection();
            var prel   = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine);

            var asm = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition("Foo", new Version(1, 0, 0, 0)),
                "Main",
                ModuleKind.Dll
                );
            var dll = Path.Combine(TempDir, "Foo.dll");

            asm.Write(dll);

            var unpackDir = GetTempPath("unpacked");

            prel.SetProperty("XamarinBuildDownloadDir", unpackDir);
            prel.SetProperty("TargetFrameworkIdentifier", "Xamarin.iOS");
            prel.SetProperty("OutputType", "Exe");
            prel.SetProperty("IntermediateOutputPath", Path.Combine(TempDir, "obj"));

            prel.AddItem(
                "XamarinBuildDownload", "AppInvites-1.0.2", new Dictionary <string, string> {
                { "Url", "https://www.gstatic.com/cpdc/278f79fcd3b365e3-AppInvites-1.0.2.tar.gz" },
                { "Kind", "Tgz" }
            });

            prel.AddItem(
                "ReferencePath",
                dll
                );

            var bundlePath = Path.Combine(unpackDir, "AppInvites-1.0.2", "Frameworks", "GINInvite.framework", "Versions", "A", "Resources", "GINInviteResources.bundle");

            var    plist        = Path.Combine(bundlePath, "Info.plist");
            string resourceName = "__monotouch_content_GINInviteResources.bundle_fInfo.plist";

            prel.AddItem(
                "RestoreAssemblyResource",
                plist,
                new Dictionary <string, string> {
                { "AssemblyName", "Foo" },
                { "LogicalName", resourceName }
            }
                );

            var image = Path.Combine(bundlePath, "*****@*****.**");

            resourceName = "__monotouch_content_GINInviteResources.bundle_fic__sms__24%403x.png";
            prel.AddItem(
                "RestoreAssemblyResource",
                image,
                new Dictionary <string, string> {
                { "AssemblyName", "Foo" },
                { "LogicalName", resourceName }
            }
                );

            AddCoreTargets(prel);

            var project = new ProjectInstance(prel);
            var log     = new MSBuildTestLogger();

            var success = BuildProject(engine, project, "_XamarinBuildCastAssemblyResources", log);

            var ignoreMessages = new List <string> {
                "Enumeration yielded no results"
            };

            ignoreMessages.AddRange(DEFAULT_IGNORE_PATTERNS);
            AssertNoMessagesOrWarnings(log, ignoreMessages.ToArray());
            Assert.True(success);

            var plistExists = File.Exists(plist);

            Assert.True(plistExists);

            var imageExists = File.Exists(image);

            Assert.True(imageExists);

            // Check if BundleResources were generated correctly.
            var bundleResources = project.GetItems("BundleResource");

            Assert.True(bundleResources != null);

            // Check if Optimize metadata was generated correctly.
            var imageResource = bundleResources.Single(b => b.GetMetadataValue("Identity").ToLower().EndsWith(".png"));

            Assert.True(imageResource.GetMetadataValue("Optimize") == "False");
        }