重构代码
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package archivex
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"b612.me/starlog/internal/runtimex"
|
||||
)
|
||||
|
||||
type FileRecord struct {
|
||||
FullPath string
|
||||
Pointer *os.File
|
||||
}
|
||||
|
||||
type Runner struct {
|
||||
Cancel context.CancelFunc
|
||||
Done chan struct{}
|
||||
}
|
||||
|
||||
type Store struct {
|
||||
files runtimex.MapKV
|
||||
runners runtimex.MapKV
|
||||
}
|
||||
|
||||
func NewStore() *Store {
|
||||
return &Store{
|
||||
files: runtimex.NewMapKV(),
|
||||
runners: runtimex.NewMapKV(),
|
||||
}
|
||||
}
|
||||
|
||||
func (store *Store) SetFile(id string, record FileRecord) error {
|
||||
if store == nil {
|
||||
return nil
|
||||
}
|
||||
return store.files.Store(id, record)
|
||||
}
|
||||
|
||||
func (store *Store) GetFile(id string) (FileRecord, bool) {
|
||||
if store == nil {
|
||||
return FileRecord{}, false
|
||||
}
|
||||
val := store.files.MustGet(id)
|
||||
if val == nil {
|
||||
return FileRecord{}, false
|
||||
}
|
||||
record, ok := val.(FileRecord)
|
||||
if !ok {
|
||||
return FileRecord{}, false
|
||||
}
|
||||
return record, true
|
||||
}
|
||||
|
||||
func (store *Store) DeleteFile(id string) error {
|
||||
if store == nil {
|
||||
return nil
|
||||
}
|
||||
return store.files.Delete(id)
|
||||
}
|
||||
|
||||
func (store *Store) SetRunner(id string, runner *Runner) error {
|
||||
if store == nil {
|
||||
return nil
|
||||
}
|
||||
return store.runners.Store(id, runner)
|
||||
}
|
||||
|
||||
func (store *Store) GetRunner(id string) (*Runner, bool) {
|
||||
if store == nil {
|
||||
return nil, false
|
||||
}
|
||||
val := store.runners.MustGet(id)
|
||||
if val == nil {
|
||||
return nil, false
|
||||
}
|
||||
runner, ok := val.(*Runner)
|
||||
if !ok || runner == nil {
|
||||
return nil, false
|
||||
}
|
||||
return runner, true
|
||||
}
|
||||
|
||||
func (store *Store) DeleteRunner(id string) error {
|
||||
if store == nil {
|
||||
return nil
|
||||
}
|
||||
return store.runners.Delete(id)
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package archivex
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStoreFileLifecycle(t *testing.T) {
|
||||
store := NewStore()
|
||||
tmp, err := ioutil.TempFile("", "starlog-archivex-*.log")
|
||||
if err != nil {
|
||||
t.Fatalf("TempFile failed: %v", err)
|
||||
}
|
||||
defer os.Remove(tmp.Name())
|
||||
defer tmp.Close()
|
||||
|
||||
rec := FileRecord{FullPath: tmp.Name(), Pointer: tmp}
|
||||
if err := store.SetFile("id-1", rec); err != nil {
|
||||
t.Fatalf("SetFile failed: %v", err)
|
||||
}
|
||||
got, ok := store.GetFile("id-1")
|
||||
if !ok {
|
||||
t.Fatalf("GetFile should return stored record")
|
||||
}
|
||||
if got.FullPath != rec.FullPath || got.Pointer != rec.Pointer {
|
||||
t.Fatalf("unexpected file record: %+v", got)
|
||||
}
|
||||
if err := store.DeleteFile("id-1"); err != nil {
|
||||
t.Fatalf("DeleteFile failed: %v", err)
|
||||
}
|
||||
if _, ok := store.GetFile("id-1"); ok {
|
||||
t.Fatalf("record should not exist after DeleteFile")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreRunnerLifecycle(t *testing.T) {
|
||||
store := NewStore()
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
runner := &Runner{Cancel: cancel, Done: make(chan struct{})}
|
||||
|
||||
if err := store.SetRunner("r-1", runner); err != nil {
|
||||
t.Fatalf("SetRunner failed: %v", err)
|
||||
}
|
||||
got, ok := store.GetRunner("r-1")
|
||||
if !ok || got != runner {
|
||||
t.Fatalf("GetRunner should return stored runner")
|
||||
}
|
||||
if err := store.DeleteRunner("r-1"); err != nil {
|
||||
t.Fatalf("DeleteRunner failed: %v", err)
|
||||
}
|
||||
if _, ok := store.GetRunner("r-1"); ok {
|
||||
t.Fatalf("runner should not exist after DeleteRunner")
|
||||
}
|
||||
_ = ctx
|
||||
}
|
||||
Reference in New Issue
Block a user