109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"git.gammaspectra.live/git/go-away/lib/challenge/wasm"
|
|
"git.gammaspectra.live/git/go-away/lib/challenge/wasm/interface"
|
|
"github.com/tetratelabs/wazero/api"
|
|
"os"
|
|
"reflect"
|
|
"slices"
|
|
)
|
|
|
|
func main() {
|
|
|
|
pathToTest := flag.String("wasm", "", "Path to test file")
|
|
makeChallenge := flag.String("make-challenge", "", "Path to contents for MakeChallenge input")
|
|
makeChallengeOutput := flag.String("make-challenge-out", "", "Path to contents for expected MakeChallenge output")
|
|
verifyChallenge := flag.String("verify-challenge", "", "Path to contents for VerifyChallenge input")
|
|
verifyChallengeOutput := flag.Uint64("verify-challenge-out", uint64(_interface.VerifyChallengeOutputOK), "Path to contents for expected VerifyChallenge output")
|
|
|
|
flag.Parse()
|
|
|
|
if *pathToTest == "" || *makeChallenge == "" || *makeChallengeOutput == "" || *verifyChallenge == "" {
|
|
flag.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
|
|
wasmData, err := os.ReadFile(*pathToTest)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
runner := wasm.NewRunner(true)
|
|
defer runner.Close()
|
|
|
|
err = runner.Compile("test", wasmData)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
makeData, err := os.ReadFile(*makeChallenge)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var makeIn _interface.MakeChallengeInput
|
|
err = json.Unmarshal(makeData, &makeIn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
makeOutData, err := os.ReadFile(*makeChallengeOutput)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var makeOut _interface.MakeChallengeOutput
|
|
err = json.Unmarshal(makeOutData, &makeOut)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
verifyData, err := os.ReadFile(*verifyChallenge)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var verifyIn _interface.VerifyChallengeInput
|
|
err = json.Unmarshal(verifyData, &verifyIn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if slices.Compare(makeIn.Key, verifyIn.Key) != 0 {
|
|
panic("challenge keys do not match")
|
|
}
|
|
|
|
err = runner.Instantiate("test", func(ctx context.Context, mod api.Module) error {
|
|
out, err := wasm.MakeChallengeCall(ctx, mod, makeIn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !reflect.DeepEqual(*out, makeOut) {
|
|
return fmt.Errorf("challenge output did not match expected output, got %v, expected %v", *out, makeOut)
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
err = runner.Instantiate("test", func(ctx context.Context, mod api.Module) error {
|
|
out, err := wasm.VerifyChallengeCall(ctx, mod, verifyIn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if out != _interface.VerifyChallengeOutput(*verifyChallengeOutput) {
|
|
return fmt.Errorf("verify output did not match expected output, got %d expected %d", out, _interface.VerifyChallengeOutput(*verifyChallengeOutput))
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
}
|