HW8 is completed

pull/8/head
Andrey Ivanov 2020-08-11 11:18:20 +03:00 committed by Andrey Ivanov
parent c804145070
commit 2716e5d53b
5 changed files with 43 additions and 26 deletions

View File

@ -5,7 +5,6 @@ import (
"io" "io"
"io/ioutil" "io/ioutil"
"os" "os"
"regexp"
"strings" "strings"
) )
@ -25,11 +24,10 @@ func ReadDir(dir string) (Environment, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
// TODO: Не правильно!
key := file.Name() key := file.Name()
key = strings.ReplaceAll(key, `=`, ``) if !strings.Contains(key, `=`) && !strings.Contains(key, `;`) {
key = strings.ReplaceAll(key, `;`, ``) e[key] = ExtractEnv(val)
e[key] = ExtractEnv(val) }
} }
} }
@ -56,14 +54,8 @@ func ReadFile(filePath string) (string, error) {
} }
func ExtractEnv(text string) string { func ExtractEnv(text string) string {
text = strings.TrimSpace(text) text = strings.TrimRight(text, " ")
r := regexp.MustCompile("\"+") text = strings.Replace(text, "\x00", "\n", -1)
text = r.ReplaceAllString(text, "")
// Удаляем все после /000
i := strings.IndexByte(text, 0)
if i > 0 {
text = text[:i]
}
return text return text
} }

View File

@ -13,26 +13,41 @@ func TestReadDir(t *testing.T) {
return return
} }
env, err := ReadDir("testdata/env/no") env, err := ReadDir("testdata/env/no")
os.RemoveAll("testdata/env/no")
require.Equal(t, env, Environment{}) require.Equal(t, env, Environment{})
require.NoError(t, err) require.NoError(t, err)
os.RemoveAll("testdata/env/no")
}) })
t.Run("Проверка = и ; в именах", func(t *testing.T) { t.Run("Проверка = и ; в именах", func(t *testing.T) {
os.RemoveAll("testdata/env/no") if err := os.RemoveAll("testdata/env/no"); err != nil {
return
}
if err := os.Mkdir("testdata/env/no", os.ModePerm); err != nil { if err := os.Mkdir("testdata/env/no", os.ModePerm); err != nil {
return return
} }
if _, err := os.Create("testdata/env/no/TES=T1"); err != nil { f1, err := os.Create("testdata/env/no/TES=T1")
if err != nil {
return return
} }
if _, err := os.Create("testdata/env/no/TES;T2"); err != nil { f2, err := os.Create("testdata/env/no/TES;T2")
if err != nil {
return return
} }
env, err := ReadDir("testdata/env/no") env, err := ReadDir("testdata/env/no")
os.RemoveAll("testdata/env/no") if err != nil {
require.Equal(t, env, Environment{"TEST1": "", "TEST2": ""}) return
}
require.Equal(t, env, Environment{})
require.NoError(t, err) require.NoError(t, err)
if err = f1.Close(); err != nil {
return
}
if err = f2.Close(); err != nil {
return
}
if err = os.RemoveAll("testdata/env/no"); err != nil {
return
}
}) })
} }
@ -52,22 +67,22 @@ func TestReadFile(t *testing.T) {
func TestExtractEnv(t *testing.T) { func TestExtractEnv(t *testing.T) {
t.Run("Zero escaping", func(t *testing.T) { t.Run("Zero escaping", func(t *testing.T) {
require.Equal(t, "zero_escape", ExtractEnv("zero_escape\x00with new line")) require.Equal(t, "zero_escape\nwith new line", ExtractEnv("zero_escape\x00with new line"))
}) })
t.Run("Quotes", func(t *testing.T) { t.Run("Quotes", func(t *testing.T) {
require.Equal(t, "quotes", ExtractEnv("\"quotes\"")) require.Equal(t, `"quotes"`, ExtractEnv("\"quotes\""))
}) })
t.Run("Pre spacing", func(t *testing.T) { t.Run("Pre spacing", func(t *testing.T) {
require.Equal(t, "pre_spased", ExtractEnv(" pre_spased")) require.Equal(t, " pre_spased", ExtractEnv(" pre_spased"))
}) })
t.Run("Post spacing", func(t *testing.T) { t.Run("Post spacing", func(t *testing.T) {
require.Equal(t, "post_spased", ExtractEnv("post_spased ")) require.Equal(t, "post_spased", ExtractEnv("post_spased "))
}) })
t.Run("Multy spacing", func(t *testing.T) { t.Run("Multy spacing", func(t *testing.T) {
require.Equal(t, "multy spased", ExtractEnv(" multy spased ")) require.Equal(t, " multy spased", ExtractEnv(" multy spased "))
}) })
} }

View File

@ -8,7 +8,17 @@ import (
func RunCmd(cmd []string, env Environment) (returnCode int) { func RunCmd(cmd []string, env Environment) (returnCode int) {
c := exec.Command(cmd[0], cmd[1:]...) c := exec.Command(cmd[0], cmd[1:]...)
for k, v := range env { for k, v := range env {
c.Env = append(os.Environ(), k+"="+v) _, ok := os.LookupEnv(k)
if ok {
if err := os.Unsetenv(k); err != nil {
return -1
}
}
if v != "" {
if err := os.Setenv(k, v); err != nil {
return -1
}
}
} }
c.Stdout = os.Stdout c.Stdout = os.Stdout
c.Stderr = os.Stderr c.Stderr = os.Stderr

View File

@ -11,7 +11,7 @@ func TestRunCmd(t *testing.T) {
require.Equal(t, code, -1) require.Equal(t, code, -1)
}) })
t.Run("Команда выполнилась", func(t *testing.T) { t.Run("Команда выполнилась", func(t *testing.T) {
code := RunCmd([]string{"ls"}, Environment{"E1": "val1"}) code := RunCmd([]string{"cmd"}, Environment{"E1": "val1"})
require.Equal(t, code, 0) require.Equal(t, code, 0)
}) })
} }

0
hw08_envdir_tool/test.sh Executable file → Normal file
View File