aminya / CompileBot.jl

Automatic compilation for Julia packages
MIT License
17 stars 10 forks source link

Using mocked functions in runtests.jl leading to `ERROR: UndefVarError: not defined` #28

Closed casabre closed 2 years ago

casabre commented 3 years ago

Originally raised at SnoopCompile #147 but identified as CompileBot issue.

Just wrapping up. Using @patches from Mocking is leading to errors like this

m = (::var"##basic_cancel_patch#268#61")(chan::AMQPClient.MessageChannel, consumer_tag::AbstractString; nowait, timeout) in Main at /home/carsten/AmqpUtils.jl/test/runtests.jl:129
m.name = Symbol("##basic_cancel_patch#268#61")
ERROR: UndefVarError:  not defined
Stacktrace:
 [1] handle_kwbody(::Module, ::Method, ::Array{String,1}, ::Type{T} where T, ::String; check_eval::Bool) at /home/carsten/.julia/packages/SnoopCompile/qKfrD/src/parcel_snoopi.jl:196
 [2] parcel(::Array{Tuple{Float64,Core.MethodInstance},1}; subst::Array{Pair{Union{Regex, AbstractChar, AbstractString},Union{Regex, AbstractChar, AbstractString}},1}, exclusions::Array{Union{Regex, AbstractChar, AbstractString},1}, remove_exclusions::Bool, check_eval::Bool, blacklist::Nothing, remove_blacklist::Nothing) at /home/carsten/.julia/packages/SnoopCompile/qKfrD/src/parcel_snoopi.jl:292
 [3] top-level scope at none:22
ERROR: failed process: Process(`julia --code-coverage=none --project=@. -e "
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:4 =#
    using SnoopCompileCore
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:6 =#
    data = #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:6 =# @snoopi(tmin = 0.01, begin
                #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:7 =#
                begin
                    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:157 =#
                    using AmqpUtils
                    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:158 =#
                    include(\"/home/carsten/AmqpUtils.jl/test/runtests.jl\")
                end
            end)
; 
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:29 =#
    packageSym = Symbol(\"AmqpUtils\")
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:32 =#
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:32 =# @info \"Processsing the generated precompile signatures\"
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:34 =#
    using SnoopCompile
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:37 =#
    pc = SnoopCompile.parcel(data; subst = Pair{Union{Regex, AbstractChar, AbstractString},Union{Regex, AbstractChar, AbstractString}}[], exclusions = Union{Regex, AbstractChar, AbstractString}[], check_eval = true)
    #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:38 =#
    if !(haskey(pc, packageSym))
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:39 =#
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:39 =# @warn \"no precompile signature is found for AmqpUtils. Don't load the package before snooping. Restart your Julia session.\"
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:40 =#
        if !(isdir(\"/home/carsten/AmqpUtils.jl/deps/SnoopCompile/precompile\"))
            #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:41 =#
            mkpath(\"/home/carsten/AmqpUtils.jl/deps/SnoopCompile/precompile\")
        end
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:43 =#
        Base.write(\"/home/carsten/AmqpUtils.jl/deps/SnoopCompile/precompile/precompile_AmqpUtils.jl\", \"function _precompile_()\n    # nothing\nend\n\")
    else
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:49 =#
        onlypackage = Dict(packageSym => sort(pc[packageSym]))
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:50 =#
        SnoopCompile.write(\"/home/carsten/AmqpUtils.jl/deps/SnoopCompile/precompile\", onlypackage)
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:51 =#
        #= /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:51 =# @info \"precompile signatures were written to /home/carsten/AmqpUtils.jl/deps/SnoopCompile/precompile\"
    end
;"`, ProcessExited(1)) [1]

Stacktrace:
 [1] pipeline_error at ./process.jl:525 [inlined]
 [2] run(::Cmd; wait::Bool) at ./process.jl:440
 [3] run(::Cmd) at ./process.jl:438
 [4] top-level scope at /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:139
 [5] eval at ./boot.jl:331 [inlined]
 [6] #snoop_bot#13 at /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:214 [inlined]
 [7] snoop_bot(::BotConfig, ::Module) at /home/carsten/.julia/packages/CompileBot/nABzu/src/snoop_bot.jl:213 (repeats 2 times)
 [8] top-level scope at /home/carsten/AmqpUtils.jl/deps/SnoopCompile/snoop_bot.jl:3
 [9] include(::String) at ./client.jl:457
 [10] top-level scope at REPL[5]:1

for instance with the following patch

connection_handle = AMQPClient.Connection();
channel_handle = AMQPClient.MessageChannel(AMQPClient.DEFAULT_CHANNEL, connection_handle);
connection_patch = @patch AMQPClient.connection(;virtualhost="/", host="localhost", port=AMQPClient.AMQP_DEFAULT_PORT, auth_params=AMQPClient.DEFAULT_AUTH_PARAMS, channelmax=AMQPClient.DEFAULT_CHANNELMAX, framemax=0, heartbeat=0, connect_timeout=AMQPClient.DEFAULT_CONNECT_TIMEOUT) = channel_handle

apply(connection_patch) do
      @test AmqpUtils.get_amqp_connection() == channel_handle
end

Just wanted to provide a minimal example in order make it reproducible. I started first with SnoopCompileBot v1.7.2 which leads to the same error as the previous one → check the README. After upgrading to CompileBot v1.0.1, the error did not occur anymore. However, running latest CompileBot with my private package did not fix it. The error is still occurring.

Thus, how can I deal with Mocking in combination with CompileBot in general?

aminya commented 3 years ago

@timholy This is actually a SnoopCompile issue. parcel fails here. CompileBot just runs parcel in the background.