typealiased / mockingbird

A Swifty mocking framework for Swift and Objective-C.

Home Page:https://mockingbirdswift.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mockingbird CI-safe won't find dylib #3 when run from a symlink for the first time

s-hocking opened this issue · comments

New Issue Checklist

  • [✅] I updated my Mockingbird framework and CLI to the latest version
  • [✅] I searched for existing GitHub issues

Description

mockingbird generate doesn't work when it is run for the first time via a symlink. The lib_InternalSwiftSyntaxParser.dylib file gets created in the same file location as the symlink, and Mockingbird complains that it can't find it.

Running the Mockingbird binary directly creates the lib_InternalSwiftSyntaxParser.dylib in the same location as the real binary and works correctly. Once the .dylib is in the right place, running Mockingbird via a symlink works correctly too.

Generator Bugs

# The symlink setup in project root directory
?130 MockingbirdTestProject % ls -l Mockingbird-cisafe                                 
total 0
drwxr-xr-x  4 shocking  staff  128 28 Jan 15:37 0.16.0
lrwxr-xr-x  1 shocking  staff   94 28 Jan 15:37 mockingbird -> /Users/shocking/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/0.16.0/mockingbird

# Running Mockingbird symlink from command line
√ MockingbirdTestProject % ./Mockingbird-cisafe/mockingbird generate --targets 'MockingbirdTestProject' --outputs "./MockingbirdMocks/MockingbirdTestProjectMocks.generated.swift" --support "./MockingbirdSupport" --disable-cache --verbose
Parse Arguments - Took 0.48 ms
Using inferred Xcode project at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdTestProject.xcodeproj
Parse Xcode Project - Took 6.96 ms
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Extract Sources - Took 3.31 ms
Found 3 source files and 14 dependency source files for target 'MockingbirdTestProject'
dyld: lazy symbol binding failed: can't resolve symbol _swiftparse_syntax_structure_versioning_identifier in /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/mockingbird because dependent dylib #3 could not be loaded
dyld: can't resolve symbol _swiftparse_syntax_structure_versioning_identifier in /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/mockingbird because dependent dylib #3 could not be loaded

# dylib created in symlink location
?6 MockingbirdTestProject % ls -l Mockingbird-cisafe
total 14616
drwxr-xr-x  4 shocking  staff      128 28 Jan 15:37 0.16.0
-rw-r--r--  1 shocking  staff  7481136 28 Jan 15:39 lib_InternalSwiftSyntaxParser.dylib
lrwxr-xr-x  1 shocking  staff       94 28 Jan 15:37 mockingbird -> /Users/shocking/checkouts/sandbox/MockingbirdTestProject/Mockingbird-cisafe/0.16.0/mockingbird

# Nothing in the binary's location
√ MockingbirdTestProject % ls -l Mockingbird-cisafe/0.16.0 
total 90176
-rw-r--r--  1 shocking  staff  13282884 28 Jan 15:37 Mockingbird-cisafe.zip
-rwxr-xr-x  1 shocking  staff  32520768  8 Oct 15:38 mockingbird

# Running Mockingbird binary directly
?130 MockingbirdTestProject % ./Mockingbird-cisafe/0.16.0/mockingbird generate --targets 'MockingbirdTestProject' --outputs "./MockingbirdMocks/MockingbirdTestProjectMocks.generated.swift" --support "./MockingbirdSupport" --disable-cache --verbose
Using inferred Xcode project at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdTestProject.xcodeproj
Parse Xcode Project - Took 7.08 ms
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Resolved product module name 'MockingbirdTestProject' for target 'MockingbirdTestProject'
Extract Sources - Took 3.22 ms
Found 3 source files and 14 dependency source files for target 'MockingbirdTestProject'
Parsed 3 import declarations and 0 compiler directives in source file at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/UIKit/UIViewController.swift
Parsed dependency source structure for module 'UIKit' at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/UIKit/UIViewController.swift
Parsed 1 import declaration and 0 compiler directives in source file at /Users/shocking/Documents/checkouts/sandbox/MockingbirdTestProject/MockingbirdSupport/Swift/Misc.swift
# etc... works correctly!

Environment

  • Mockingbird CLI version (mockingbird version) - 0.16.0
  • Xcode and macOS version (are you running a beta?) - Xcode 12.4 (12D4e), macOS 10.15.7
  • Swift version (swift --version) - Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28), Target: x86_64-apple-darwin19.6.0
  • Installation method (CocoaPods, Carthage, from source, etc) - downloading CI-safe binary manually
  • Unit testing framework (XCTest, Quick + Nimble, etc) - N/A
  • Does your project use .mockingbird-ignore? - no
  • Are you using supporting source files? - yes

I've also noticed the same problem show up when CI-safe Mockingbird is run for the first time via an Xcode build phase. The lib_InternalSwiftSyntaxParser.dylib file is created in an unknown location and causes the same error about dylib #3.

Thanks for reporting, this is an interesting edge case. We should be using POSIX.realpath() to determine the dylib unbundling location. It should be a pretty straightforward change (only to the CLI launch code); happy to review PRs if anyone wants to take a shot (https://github.com/birdrides/mockingbird/wiki/Local-Development).