# This file is a part of Julia. License is MIT: https://julialang.org/license
# tests the output of the embedding example is correct
using Test
using Pkg
if Sys.iswindows()
# libjulia needs to be in the same directory as the embedding executable or in path
ENV["PATH"] = string(Sys.BINDIR, ";", ENV["PATH"])
end
function checknum(s, rx, cond)
m = match(rx, s)
if m === nothing
return false
else
num = m[1]
return cond(parse(UInt, num))
end
end
@test length(ARGS) == 1
@testset "gcext example" begin
out = Pipe()
err = Pipe()
p = run(pipeline(Cmd(ARGS), stdin=devnull, stdout=out, stderr=err), wait=false)
close(out.in)
close(err.in)
out_task = @async readlines(out)
err_task = @async readlines(err)
# @test success(p)
errlines = fetch(err_task)
lines = fetch(out_task)
@test length(errlines) == 0
# @test length(lines) == 6
@test length(lines) == 5
@test checknum(lines[2], r"([0-9]+) full collections", n -> n >= 10)
@test checknum(lines[3], r"([0-9]+) partial collections", n -> n > 0)
@test checknum(lines[4], r"([0-9]+) object sweeps", n -> n > 0)
# @test checknum(lines[5], r"([0-9]+) internal object scan failures",
# n -> n == 0)
# @test checknum(lines[6], r"([0-9]+) corrupted auxiliary roots",
# n -> n == 0)
@test checknum(lines[5], r"([0-9]+) corrupted auxiliary roots",
n -> n == 0)
end
@testset "Package with foreign type" begin
load_path = copy(LOAD_PATH)
push!(LOAD_PATH, joinpath(@__DIR__, "Foreign"))
push!(LOAD_PATH, joinpath(@__DIR__, "DependsOnForeign"))
try
# Force recaching
Base.compilecache(Base.identify_package("Foreign"))
Base.compilecache(Base.identify_package("DependsOnForeign"))
push!(LOAD_PATH, joinpath(@__DIR__, "ForeignObjSerialization"))
@test_throws ErrorException Base.compilecache(Base.identify_package("ForeignObjSerialization"), Base.DevNull())
pop!(LOAD_PATH)
(@eval (using Foreign))
@test Base.invokelatest(Foreign.get_nmark) == 0
@test Base.invokelatest(Foreign.get_nsweep) == 0
obj = Base.invokelatest(Foreign.FObj)
GC.@preserve obj begin
GC.gc(true)
end
@test Base.invokelatest(Foreign.get_nmark) > 0
@time Base.invokelatest(Foreign.test, 10)
GC.gc(true)
@test Base.invokelatest(Foreign.get_nsweep) > 0
(@eval (using DependsOnForeign))
Base.invokelatest(DependsOnForeign.f, obj)
finally
copy!(LOAD_PATH, load_path)
end
end