2021-08-11 11:06:46 +03:00
|
|
|
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 ()
|
|
|
|
{
|
2016-11-03 15:20:31 +03:00
|
|
|
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" }) {
|
2020-04-16 15:19:45 +03:00
|
|
|
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 ()
|
|
|
|
{
|
2016-11-03 15:20:31 +03:00
|
|
|
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
|
2020-04-16 15:19:45 +03:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-21 19:48:15 +03:00
|
|
|
|
|
|
|
[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",
|
2019-04-23 18:53:35 +03:00
|
|
|
"__ZN16XamarinCallState",
|
2019-03-08 21:31:10 +03:00
|
|
|
".objc_class_name_Xamarin", // 32-bit macOS naming scheme
|
|
|
|
".objc_category_name_NSObject_NonXamarinObject", // 32-bit macOS naming scheme
|
2018-11-21 19:48:15 +03:00
|
|
|
"_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_",
|
2019-02-01 14:55:55 +03:00
|
|
|
"_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",
|
2018-11-21 19:48:15 +03:00
|
|
|
"_MapHardwareType",
|
|
|
|
"_gateway_from_rtm",
|
|
|
|
"_sgen_",
|
|
|
|
"_arm_patch",
|
2019-06-19 08:20:02 +03:00
|
|
|
// These aren't public in a way we care about
|
2018-11-21 19:48:15 +03:00
|
|
|
"l_OBJC_LABEL_PROTOCOL_$_",
|
2019-06-19 08:20:02 +03:00
|
|
|
"__OBJC_LABEL_PROTOCOL_$_", // Xcode 11 b1 format
|
2018-11-21 19:48:15 +03:00
|
|
|
"l_OBJC_PROTOCOL_$_",
|
2019-06-19 08:20:02 +03:00
|
|
|
"__OBJC_PROTOCOL_$_", // Xcode 11 b1 format
|
2019-04-02 09:12:56 +03:00
|
|
|
// block stuff, automatically exported by clang
|
|
|
|
"___block_descriptor_",
|
|
|
|
"___copy_helper_block_",
|
|
|
|
"___destroy_helper_block_",
|
2019-10-28 17:40:53 +03:00
|
|
|
// compiler-generated helper methods
|
|
|
|
"___os_log_helper_",
|
2022-04-04 10:55:05 +03:00
|
|
|
// Brotli compression symbols
|
|
|
|
"_kBrotli",
|
|
|
|
"__kBrotli",
|
2018-11-21 19:48:15 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
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) {
|
2019-03-08 21:31:10 +03:00
|
|
|
var symbols = MTouchTool.GetNativeSymbolsInExecutable (path, arch: "all");
|
2018-11-21 19:48:15 +03:00
|
|
|
|
|
|
|
// 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;
|
2019-03-08 21:31:10 +03:00
|
|
|
// Helper objc_msgSend functions for arm64
|
|
|
|
case "_objc_msgSend_stret":
|
|
|
|
case "_objc_msgSendSuper_stret":
|
|
|
|
return false;
|
2018-11-21 19:48:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
2019-03-08 21:31:10 +03:00
|
|
|
|
|
|
|
// 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;
|
2018-11-21 19:48:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|