summaryrefslogtreecommitdiff
path: root/doTest.go
blob: 1247d9474e452df98288283a7972d6d9fab55d82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0

package main

import (
	"errors"
	"strings"

	"github.com/go-cmd/cmd"
	"go.wit.com/lib/config"
	"go.wit.com/lib/gui/shell"
	"go.wit.com/log"
)

func doTest() (string, error) {
	var s string
	var allerr error

	initForge()

	if argv.Test.Version != nil {
		data, err := resources.ReadFile("resources/TESTVERSION")
		if err != nil {
			s = "open repomap failed"
			log.Info(s, err)
			return s, err
		}
		if len(data) == 0 {
			s = "resources/repomap is empty"
			log.Info(s, err)
			return s, config.ErrEmpty
		}
		for _, line := range strings.Split(string(data), "\n") {
			line := strings.TrimSpace(line)
			if line == "" {
				continue
			}
			parts := strings.Fields(line)
			cmdname := parts[len(parts)-1]
			if argv.Test.Copy {
				// find cmdname repo
				for repo := range me.forge.IterByMode() {
					if !strings.HasPrefix(repo.Namespace, "go.wit.com") {
						continue
					}
					if !strings.HasSuffix(repo.Namespace, cmdname) {
						continue
					}
					if cmdname == "forge" {
						continue
					}
					if cmdname == "autogenpb" {
						continue
					}
					cmd := []string{"cp", "-f", "argv.template.go", repo.FullPath + "/"}
					shell.RunVerbose(cmd)
				}
				continue
			}
			if argv.Test.Version != nil {
				// log.Info("LINE=", cmdname)
				allerr = errors.Join(allerr, doTestVersion(cmdname))
			}
		}
		if allerr != nil {
			log.Printf("ALLERR=(%v)\n", allerr)
			return "version tests failed", allerr
		}
		return "all version tests passed", nil
	}
	return "nothing tested", nil
}

func versionStderr(cmdname string, r *cmd.Status) error {
	stderr := errors.New(cmdname + " version test broken")

	for _, line := range r.Stderr {
		log.Info("STDERR:", line)
	}
	for _, line := range r.Stdout {
		log.Info("STDOUT:", line)
	}
	if r.Error != nil {
		return errors.Join(stderr, r.Error)
	}
	if r.Exit == 0 {
		return errors.Join(stderr, errors.New("exit -1"))
	}
	return stderr
}

func doTestVersion(cmdname string) error {

	r := shell.Run([]string{cmdname, "--version"})
	if r.Exit != 0 {
		return versionStderr(cmdname, &r)
	}
	if r.Error != nil {
		return versionStderr(cmdname, &r)
	}
	if len(r.Stdout) == 0 {
		return versionStderr(cmdname, &r)
	}
	if len(r.Stdout) == 1 {
		line := r.Stdout[0]
		if !strings.HasPrefix(line, cmdname) {
			return versionStderr(cmdname, &r)
		}
		log.Info(line)
		// probably okay
		return nil
	}
	if len(r.Stdout) == 2 {
		line := r.Stdout[0]
		if !strings.HasPrefix(line, "APPNAME=") {
			return versionStderr(cmdname, &r)
		}
		line = r.Stdout[1]
		if !strings.HasPrefix(line, cmdname) {
			return versionStderr(cmdname, &r)
		}
		log.Info(line)
		// probably okay
		return nil
	}
	return versionStderr(cmdname, &r)
}