COCOS-278 - Abstract state machine (#280)

* abstract state machine

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* perpetual results consumption

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* async action

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* fix failing tests

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* fix failing test

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

---------

Signed-off-by: Sammy Oina <sammyoina@gmail.com>
This commit is contained in:
Sammy Kerata Oina
2024-10-09 14:19:12 +03:00
committed by GitHub
parent fb0fbaeb9a
commit db7f3c7a4b
11 changed files with 661 additions and 311 deletions
+29 -2
View File
@@ -4,13 +4,17 @@ package cli
import (
"encoding/pem"
"fmt"
"os"
"github.com/fatih/color"
"github.com/spf13/cobra"
)
const resultFilePath = "results.zip"
const (
resultFilePrefix = "results"
resultFileExt = ".zip"
)
func (cli *CLI) NewResultsCmd() *cobra.Command {
return &cobra.Command{
@@ -42,12 +46,35 @@ func (cli *CLI) NewResultsCmd() *cobra.Command {
return
}
resultFilePath, err := getUniqueFilePath(resultFilePrefix, resultFileExt)
if err != nil {
printError(cmd, "Error generating unique file path: %v ❌ ", err)
return
}
if err := os.WriteFile(resultFilePath, result, 0o644); err != nil {
printError(cmd, "Error saving computation result file: %v ❌ ", err)
return
}
cmd.Println(color.New(color.FgGreen).Sprint("Computation result retrieved and saved successfully! ✔ "))
cmd.Println(color.New(color.FgGreen).Sprintf("Computation result retrieved and saved successfully as %s! ✔ ", resultFilePath))
},
}
}
func getUniqueFilePath(prefix, ext string) (string, error) {
for i := 0; ; i++ {
var filename string
if i == 0 {
filename = prefix + ext
} else {
filename = fmt.Sprintf("%s_%d%s", prefix, i, ext)
}
if _, err := os.Stat(filename); os.IsNotExist(err) {
return filename, nil
} else if err != nil {
return "", err
}
}
}
+72 -6
View File
@@ -1,11 +1,14 @@
// Copyright (c) Ultraviolet
// SPDX-License-Identifier: Apache-2.0
package cli
import (
"bytes"
"errors"
"fmt"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/mock"
@@ -32,12 +35,50 @@ func TestResultsCmd_Success(t *testing.T) {
require.Contains(t, buf.String(), "Computation result retrieved and saved successfully")
resultFile, err := os.ReadFile("results.zip")
files, err := filepath.Glob("results*.zip")
require.NoError(t, err)
require.Len(t, files, 1)
resultFile, err := os.ReadFile(files[0])
require.NoError(t, err)
require.Equal(t, compResult, string(resultFile))
t.Cleanup(func() {
os.Remove("results.zip")
for _, file := range files {
os.Remove(file)
}
os.Remove(privateKeyFile)
})
}
func TestResultsCmd_MultipleExecutions(t *testing.T) {
mockSDK := new(mocks.SDK)
mockSDK.On("Result", mock.Anything, mock.Anything).Return([]byte(compResult), nil)
testCLI := New(mockSDK)
err := generateRSAPrivateKeyFile(privateKeyFile)
require.NoError(t, err)
cmd := testCLI.NewResultsCmd()
buf := new(bytes.Buffer)
cmd.SetOut(buf)
cmd.SetArgs([]string{privateKeyFile})
for i := 0; i < 3; i++ {
err = cmd.Execute()
require.NoError(t, err)
require.Contains(t, buf.String(), "Computation result retrieved and saved successfully")
buf.Reset()
}
files, err := filepath.Glob("results*.zip")
require.NoError(t, err)
require.Len(t, files, 3)
t.Cleanup(func() {
for _, file := range files {
os.Remove(file)
}
os.Remove(privateKeyFile)
})
}
@@ -87,8 +128,8 @@ func TestResultsCmd_SaveFailure(t *testing.T) {
err := generateRSAPrivateKeyFile(privateKeyFile)
require.NoError(t, err)
// Simulate failure in saving the result file by making a directory with the same name as the result file
err = os.Mkdir("results.zip", 0o755)
// Simulate failure in saving the result file by making all files read-only
err = os.Chmod(".", 0o555)
require.NoError(t, err)
cmd := testCLI.NewResultsCmd()
@@ -102,8 +143,10 @@ func TestResultsCmd_SaveFailure(t *testing.T) {
mockSDK.AssertCalled(t, "Result", mock.Anything, mock.Anything)
t.Cleanup(func() {
os.Remove("results.zip")
os.Remove(privateKeyFile)
err := os.Chmod(".", 0o755)
require.NoError(t, err)
err = os.Remove(privateKeyFile)
require.NoError(t, err)
})
}
@@ -132,3 +175,26 @@ func TestResultsCmd_InvalidPrivateKey(t *testing.T) {
require.Contains(t, buf.String(), "Error decoding private key")
mockSDK.AssertNotCalled(t, "Result", mock.Anything, mock.Anything)
}
func TestGetUniqueFilePath(t *testing.T) {
prefix := "test"
ext := ".txt"
path, err := getUniqueFilePath(prefix, ext)
require.NoError(t, err)
require.Equal(t, "test.txt", path)
_, err = os.Create("test.txt")
require.NoError(t, err)
defer os.Remove("test.txt")
for i := 1; i < 3; i++ {
fileName := fmt.Sprintf("%s_%d%s", prefix, i, ext)
_, err := os.Create(fileName)
require.NoError(t, err)
defer os.Remove(fileName)
}
path, err = getUniqueFilePath(prefix, ext)
require.NoError(t, err)
require.Equal(t, "test_3.txt", path)
}