mirror of
https://github.com/ultravioletrs/cocos.git
synced 2026-06-23 04:10:25 +00:00
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:
committed by
GitHub
parent
fb0fbaeb9a
commit
db7f3c7a4b
+29
-2
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user