xamarin-macios/tests/mtouch/MiscTests.cs

209 строки
5.9 KiB
C#
Исходник Обычный вид История

using System;
2016-05-26 16:06:52 +03:00
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using Xamarin.Tests;
using NUnit.Framework;
namespace Xamarin.Tests
{
[TestFixture]
public class Misc
{
[Test]
public void InvalidStructOffset ()
{
MTouch.AssertDeviceAvailable ();
2016-05-26 16:06:52 +03:00
var str = "invalid struct offset";
var contents = ASCIIEncoding.ASCII.GetBytes (str);
foreach (var sdk in new string [] { "iphoneos", "iphonesimulator"}) {
foreach (var ext in new string [] { "dylib", "a" }) {
var fn = Path.Combine (Configuration.MonoTouchRootDirectory, "SDKs", "MonoTouch." + sdk + ".sdk", "lib", "libmonosgen-2.0." + ext);
2016-05-26 16:06:52 +03:00
Assert.IsFalse (Contains (fn, contents), "Found \"{0}\" in {1}", str, fn);
}
}
}
bool Contains (string file, byte[] contents)
{
var pagesize = 4096;
var buffer = new byte [pagesize * 1024];
int read;
using (var fs = new FileStream (file, FileMode.Open, FileAccess.Read)) {
while ((read = fs.Read (buffer, 0, buffer.Length)) > 0) {
for (int i = 0; i < read - contents.Length; i++) {
if (buffer [i] == contents [0]) {
var found = true;
for (int c = 1; c < contents.Length; c++) {
if (buffer [i + c] != contents [c]) {
found = false;
break;
}
}
if (found)
return true;
}
}
if (fs.Position == fs.Length)
break;
fs.Position -= pagesize; // return a bit so that we don't miss contents spanning multiple reads.
}
}
return false;
}
[Test]
public void VerifySymbols ()
{
MTouch.AssertDeviceAvailable ();
2016-05-26 16:06:52 +03:00
var prohibited_symbols = new string [] { "_NSGetEnviron", "PKService", "SPPluginDelegate" };
foreach (var symbol in prohibited_symbols) {
var contents = ASCIIEncoding.ASCII.GetBytes (symbol);
var sdk = "iphoneos"; // we don't care about private symbols for simulator builds
foreach (var static_lib in Directory.EnumerateFiles (Path.Combine (Configuration.MonoTouchRootDirectory, "SDKs", "MonoTouch." + sdk + ".sdk", "lib"), "*.a")) {
2016-05-26 16:06:52 +03:00
Assert.IsFalse (Contains (static_lib, contents), "Found \"{0}\" in {1}", symbol, static_lib);
}
}
}
[Test]
[TestCase (Profile.iOS)]
[TestCase (Profile.tvOS)]
[TestCase (Profile.watchOS)]
[TestCase (Profile.macOSMobile)]
public void PublicSymbols (Profile profile)
{
var paths = new HashSet<string> ();
if (Configuration.include_device)
paths.UnionWith (Directory.GetFileSystemEntries (Configuration.GetSdkPath (profile, true), "*.a", SearchOption.AllDirectories));
paths.UnionWith (Directory.GetFileSystemEntries (Configuration.GetSdkPath (profile, false), "*.a", SearchOption.AllDirectories));
var failed = new StringBuilder ();
var prefixes = new string [] {
// xamarin-macios
"_xamarin_",
"_monotouch_",
"_monomac_",
"_OBJC_METACLASS_$_Xamarin",
"_OBJC_CLASS_$_Xamarin",
"_OBJC_IVAR_$_Xamarin",
"__ZN13XamarinObject",
[runtime] Rename CallState to XamarinCallState to keep the public namespace cleaner. (#5940) Also ignore the corresponding public symbols in the PublicSymbols test. This was introduced in 464882d14a83a13f9fd6a3d9df2ca4d844933e36 (changes to the CallState struct made the compiler create public symbols). Fixes these test failures: 1) Failed : Xamarin.Tests.Misc.PublicSymbols(iOS) Failed libraries Expected: <empty> But was: "/work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/MonoTouch.iphonesimulator.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv " at Xamarin.Tests.Misc.PublicSymbols (Xamarin.Tests.Profile profile) [0x00259] in /work/maccore/master/xamarin-macios/tests/mtouch/MiscTests.cs:196 2) Failed : Xamarin.Tests.Misc.PublicSymbols(tvOS) Failed libraries Expected: <empty> But was: "/work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.AppleTVOS.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.AppleTVSimulator.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv " at Xamarin.Tests.Misc.PublicSymbols (Xamarin.Tests.Profile profile) [0x00259] in /work/maccore/master/xamarin-macios/tests/mtouch/MiscTests.cs:196 3) Failed : Xamarin.Tests.Misc.PublicSymbols(watchOS) Failed libraries Expected: <empty> But was: "/work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchOS.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv " at Xamarin.Tests.Misc.PublicSymbols (Xamarin.Tests.Profile profile) [0x00259] in /work/maccore/master/xamarin-macios/tests/mtouch/MiscTests.cs:196 4) Failed : Xamarin.Tests.Misc.PublicSymbols(macOSMobile) Failed libraries Expected: <empty> But was: "/work/maccore/master/xamarin-macios/_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/libxammac-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/libxammac-system-debug.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/libxammac-system.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv /work/maccore/master/xamarin-macios/_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/libxammac.a: __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv __ZN9CallState3selEv __ZN9CallState4selfEv __ZN9CallState8is_stretEv " at Xamarin.Tests.Misc.PublicSymbols (Xamarin.Tests.Profile profile) [0x00259] in /work/maccore/master/xamarin-macios/tests/mtouch/MiscTests.cs:196
2019-04-23 18:53:35 +03:00
"__ZN16XamarinCallState",
".objc_class_name_Xamarin", // 32-bit macOS naming scheme
".objc_category_name_NSObject_NonXamarinObject", // 32-bit macOS naming scheme
"_main",
// I think these are inline functions from a header
"__Z7isasciii",
"__Z7isblanki",
"__Z7isdigiti",
"__Z8__istypeim",
"__Z9__isctypeim",
// mono
"_mono_",
"_monoeg_",
"_eg_",
"_mini_",
"_proflog_",
"_ves_icall_",
"___mono_jit_",
"_sdb_options",
"_SystemNative_",
"_NetSecurityNative_",
Bump to mono:2019-06 (#6196) * Use the commonly used casing for `MSBuildSDKsPath` property Handle "incorrectly" cased msbuild property names msbuild property names are case insensitive. While generating the custom app.config, in `SetToolsetProperty(..)` we try to update the property if it already exists. But the name lookup was case sensitive, thus causing the lookup to fail, resulting in two entries for the same property name differing only in case. Eg. `MSBuildSDKsPath` vs `MSBuildSdksPath`. * [mtouch] Whitelist new Brotli native symbols in Xamarin.Tests.Misc.PublicSymbols test * [mtouch] Better assert in NoLLVMFailuresInWatchOS() test We'd list the "LLVM failed" messages before even though the AOT might've crashed and the list is meaningless. Assert the exit code before that. * [mtouch] Use new LLVM even for 32bit targets See https://github.com/mono/mono/issues/14841 and https://github.com/mono/mono/issues/9621 * [mtouch] Work around slow LLVM in "don't link" test See https://github.com/mono/mono/issues/14843 * Remove useless conditional * Remove LLVM36 from Makefile * [watch4] set right min version for arm64_32 based watch devices (#6307) Fixes the confusion around `libmono-native*` (see for example https://github.com/xamarin/xamarin-macios/commit/ce5ba1e41d526eddd9b61f68fae22a747831e9f2#commitcomment-33834491 ) when building with `MONO_BUILD_FROM_SOURCE=1`. * reflect watchos64_32_version_min change from mono sdk * Move mono hash info to mk/mono.mk so that existing scripts work. * Add Makefile dependency on mono.mk where necessary With https://github.com/xamarin/xamarin-macios/commit/3e7bc29adec8dff3558c284a3050f2db36ea3cf2 the Mono hash was moved from Make.config to mono.mk. We need to add a Makefile dependency on this file wherever Make.config was used to track a Mono dependency. * [tests] Copy mk/mono.mk to the XM test package. * [tests] Update minOS version test after consolidating min watchOS versions everywhere. Fixes this mtouch and mmptest failure: 1) Failed : Xamarin.Tests.ProductTests.MinOSVersion(watchOS,MinwatchOS,WatchOSSimulator,False) Failures Expected: <empty> But was: < "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (mono-runtime-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (bindings-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (bindings-generated-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (shared-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (runtime-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (trampolines-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (trampolines-invoke-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (xamarin-support-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (nsstring-localization-debug.arm64_32.o).", "Unexpected minOS version (expected 2.0.0, alternatively 2.0.0, found 5.1.0) in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/SDKs/Xamarin.WatchSimulator.sdk/usr/lib/libxamarin-debug.a (trampolines-varargs-debug.arm64_32.o)."... > * [mmp] Fix make clean target It needs an -r to remove directories: ``` rm: bin: is a directory rm: obj: is a directory ``` * Add new xamarin_timezone_get_local_name() to a few more places
2019-07-16 18:24:00 +03:00
"_Brotli",
"_kStaticDictionaryHash",
"_MapHardwareType",
"_gateway_from_rtm",
"_sgen_",
"_arm_patch",
// These aren't public in a way we care about
"l_OBJC_LABEL_PROTOCOL_$_",
"__OBJC_LABEL_PROTOCOL_$_", // Xcode 11 b1 format
"l_OBJC_PROTOCOL_$_",
"__OBJC_PROTOCOL_$_", // Xcode 11 b1 format
// block stuff, automatically exported by clang
"___block_descriptor_",
"___copy_helper_block_",
"___destroy_helper_block_",
// compiler-generated helper methods
"___os_log_helper_",
// Brotli compression symbols
"_kBrotli",
"__kBrotli",
};
paths.RemoveWhere ((v) => {
var file = Path.GetFileName (v);
switch (file) {
case "libxammac-classic.a":
case "libxammac-classic-debug.a":
case "libxammac-system-classic.a":
case "libxammac-system-classic-debug.a":
return true;
}
return false;
});
foreach (var path in paths) {
var symbols = MTouchTool.GetNativeSymbolsInExecutable (path, arch: "all");
// Remove known public symbols
symbols = symbols.Where ((v) => {
foreach (var prefix in prefixes) {
if (v.StartsWith (prefix, StringComparison.Ordinal))
return false;
}
// zlib-helper symbols
switch (v) {
case "_CloseZStream":
case "_CreateZStream":
case "_Flush":
case "_ReadZStream":
case "_WriteZStream":
return false;
// Helper objc_msgSend functions for arm64
case "_objc_msgSend_stret":
case "_objc_msgSendSuper_stret":
return false;
}
// Be a bit more lenient with symbols from the static registrar
if (path.Contains (".registrar.")) {
if (v.StartsWith ("_OBJC_CLASS_$", StringComparison.Ordinal))
return false;
if (v.StartsWith ("_OBJC_IVAR_$", StringComparison.Ordinal))
return false;
if (v.StartsWith ("_OBJC_METACLASS_$", StringComparison.Ordinal))
return false;
// 32-bit macOS naming scheme:
if (v.StartsWith (".objc_class_name_", StringComparison.Ordinal))
return false;
if (v.StartsWith (".objc_category_name_", StringComparison.Ordinal))
return false;
}
return true;
});
// If there are any public symbols left, that's a problem so fail the test.
if (symbols.Any ())
failed.AppendLine ($"{path}:\n\t{string.Join ("\n\t", symbols.ToArray ())}");
}
Assert.IsEmpty (failed.ToString (), "Failed libraries");
}
2016-05-26 16:06:52 +03:00
}
}