//go:build mage package main import ( "context" "fmt" "log" "os" "strings" // mage:import . "magefile/docker" "github.com/magefile/mage/mg" ) var ( GolangVolume = "golang.my" tests_to_run = []string{} ) func init() { AppName = "ktgo" ImageName = "my/go" BuildFn = build } func Test() { mg.Deps(TestLibs) mg.Deps(TestIntegration) mg.Deps(TestSharedLibsBuild) } func TestLibs(ctx context.Context) error { paths := []string{ "pkg", "pkg/printer", "pkg/scenarios", "pkg/link", "pkg/link/wifi", "pkg/parser", "internal", } listTests(paths) // err := addTest("test") // if err != nil { // println("ERROR: " + "test") // return err // } return runListedTests() } func TestIntegration(ctx context.Context) error { return runTests("./test/int") } func TestSystem(ctx context.Context) error { return runTests("./test") } func listTests(paths []string) error { for _, p := range paths { listAndTest(p) } return nil } func listAndTest(p string) error { entries, err := os.ReadDir(p) if err != nil { log.Fatal(err) } return testList(p, entries) } func testList(p string, entries []os.DirEntry) error { for _, e := range entries { testOne(p, e) } return nil } func testOne(p string, e os.DirEntry) error { if !e.IsDir() { return nil } if e.Name() == "driver" { return nil } if e.Name() == "lib" { return nil } if e.Name() == "testlib" { return nil } entries, err := os.ReadDir(p + "/" + e.Name()) if err != nil { log.Fatal(err) } found := false for _, e2 := range entries { if e2.IsDir() { continue } if strings.Contains(e2.Name(), "_test.go") { found = true break } } if !found { return nil } testPath := p + "/" + e.Name() err = addTest(testPath) if err != nil { println("ERROR: " + testPath) return err } return nil } func addTest(p string) error { tests_to_run = append(tests_to_run, "./"+p) return nil } func runListedTests() error { test_paths := strings.Join(tests_to_run, " ") return runTests(test_paths) } func runTests(paths string) error { Bash(`cp -f $HOME/.Xauthority /tmp/._test_Xauthority`) return Bash(`sudo docker run -ti --rm \ -h host \ --net=none \ -v /etc/localtime:/etc/localtime:ro \ -v ` + GolangVolume + `:/usr/local/go:ro \ \ -v /gopath:/gopath:rw \ -v ${PWD}:/app \ -v /usr/bin/docker:/usr/bin/docker:ro \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ -v /usr/bin/socat:/usr/bin/socat \ \ -e GOPATH=/gopath \ -e GOCACHE=/gopath/gocache \ -e APPDIR=${PWD} \ \ --device=/dev/dri/card0 \ -e DISPLAY=:0 \ -v /tmp/.X11-unix:/tmp/.X11-unix:ro \ -v /tmp/._test_Xauthority:/home/user/.Xauthority:ro \ \ -w /app \ -u 0 \ \ --entrypoint=/bin/bash \ \ ` + ImageName + " -c '" + ` \ for t in ` + paths + `; do \ go test -v -p 1 -gcflags=-l -count=1 $t || exit 1; \ done'`) } func TestSharedLibsBuild(ctx context.Context) error { mg.Deps(Build_shared_lib) return Bash(`rm lib/lib3dscreen.*`) } func build() { Build_shared_lib(context.Background()) } func Build_shared_lib(ctx context.Context) error { return Bash(`sudo docker run --rm \ -h host \ --net=none \ -v /etc/localtime:/etc/localtime:ro \ -v ` + GolangVolume + `:/usr/local/go:ro \ \ -v /gopath:/gopath:rw \ -v ${PWD}:/app \ \ -e GOPATH=/gopath \ -e GOCACHE=/gopath/gocache \ \ -w /app/pkg/sharedlib \ -u 1000 \ \ --entrypoint=/bin/bash \ \ ` + ImageName + " -c '" + ` \ go build -o /app/lib/libktgo.so -buildmode=c-shared \ && strip /app/lib/libktgo.so \ '`) } func Mobile() { Build_Mobile() Upload_Mobile() } func Build_Mobile() { Bash(`sudo docker run -ti --rm \ -h host \ --net=bridge \ -v /etc/localtime:/etc/localtime:ro \ \ -v ` + GolangVolume + `:/usr/local/go:ro \ -v /gopath:/gopath:rw \ -v ${PWD}:/app \ \ -v /etc/java-17-openjdk:/etc/java-17-openjdk:ro \ -v /usr/lib/jvm/java-17-openjdk-amd64:/usr/lib/jvm/java-17-openjdk-amd64:ro \ \ -e PATH=$PATH:/usr/local/go/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin \ -e GOPATH=/gopath \ -e GOCACHE=/gopath/gocache \ -e HOME=/home/user \ \ -w /app/pkg/mlib/ktgo \ -u 1000 \ \ -v android_sdk:/sdk:ro \ -e ANDROID_HOME=/sdk \ \ --entrypoint=/gopath/bin/gomobile \ \ ` + ImageName + " " + `\ bind -o /app/lib/ktgo.aar \ `) Bash(`cp -afv lib/ktgo.aar ~/wd/mobile/apks/src/Telegram-FOSS/TMessagesProj/libs`) } func Upload_Mobile() { Bash(`unzip lib/ktgo.aar jni/arm64-v8a/libgojni.so \ && adb push jni/arm64-v8a/libgojni.so /sdcard/scripts/ \ ; rm jni/arm64-v8a/libgojni.so; rmdir jni/arm64-v8a jni \ `) fmt.Printf(` su -c 'mv -fv /sdcard/scripts/libgojni.so /data/app/*/org.telegram.messenger-*/lib/arm64' `) Bash(`adb shell \ `) }