env GOPRIVATE=test/main

env SEED1=OQg9kACEECQ
env SEED2=NruiDmVz6/s

# Check the binary with a given base64 encoded seed
garble -seed=${SEED1} build
exec ./main$exe
cmp stderr main.stderr
binsubstr main$exe 'teststring' 'imported var value'
! binsubstr main$exe 'ImportedVar'

[short] stop # the extra checks are relatively expensive

exec ./main$exe funcName
cp stderr funcName-seed-static-1

# Also check that the binary is reproducible.
# No packages should be rebuilt either, thanks to the build cache.
cp main$exe main_old$exe
rm main$exe
garble -seed=${SEED1}= build -v
! stderr .
bincmp main$exe main_old$exe

exec ./main$exe funcName
cmp stderr funcName-seed-static-1

# Also check that a different seed leads to a different binary.
# We can't know if caching happens here, because of previous test runs.
cp main$exe main_old$exe
rm main$exe
garble -seed=${SEED2} build
! bincmp main$exe main_old$exe

exec ./main$exe funcName
cp stderr funcName-seed-static-2
! bincmp funcName-seed-static-2 funcName-seed-static-1

# Use a random seed, which should always trigger a full build.
garble -seed=random build -v
stderr -count=1 '^runtime$'
stderr -count=1 '^test/main$'
exec ./main$exe
cmp stderr main.stderr
binsubstr main$exe 'teststring' 'imported var value'
! binsubstr main$exe 'ImportedVar'

exec ./main$exe funcName
cp stderr funcName-seed-random-1
! bincmp funcName-seed-random-1 funcName-seed-static-1

# Also check that the random binary is not reproducible.
cp main$exe main_old$exe
rm main$exe
garble -seed=random build -v
stderr .
! bincmp main$exe main_old$exe

exec ./main$exe funcName
cp stderr funcName-seed-random-2
! bincmp funcName-seed-random-2 funcName-seed-random-1

# Using different flags which affect the build, such as -literals or -tiny,
# should result in different obfuscation of names etc.
# There's strictly no reason to have this rule,
# but the flags result in different builds and binaries anyway,
# so we might as well make them as different as possible.

garble -seed=${SEED1} -literals build
exec ./main$exe funcName
! bincmp stderr funcName-seed-static-1

garble -seed=${SEED1} -tiny build
exec ./main$exe funcName
! bincmp stderr funcName-seed-static-1

-- go.mod --
module test/main

go 1.16
-- main.go --
package main

import (
	"os"
	"runtime"

	"test/main/imported"
)

var teststringVar = "teststring"

func main() {
	if len(os.Args) > 1 && os.Args[1] == "funcName" {
		println(originalFuncName())
	} else {
		println(teststringVar)
		println(imported.ImportedVar)
	}
}

func originalFuncName() string {
	pc, _, _, _ := runtime.Caller(0)
	fn := runtime.FuncForPC(pc)
	return fn.Name()
}
-- imported/imported.go --
package imported

var ImportedVar = "imported var value"

-- main.stderr --
teststring
imported var value
