blob: 743a41de4a2acbddb66944724d90164ae9ccbd08 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package file
import (
"archive/tar"
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
import (
"github.com/mitchellh/go-homedir"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/test"
)
// AsBytes is a simple wrapper around os.ReadFile provided for completeness.
func AsBytes(filename string) ([]byte, error) {
return os.ReadFile(filename)
}
// AsBytesOrFail calls AsBytes and fails the test if any errors occurred.
func AsBytesOrFail(t test.Failer, filename string) []byte {
t.Helper()
content, err := AsBytes(filename)
if err != nil {
t.Fatal(err)
}
return content
}
// AsString is a convenience wrapper around os.ReadFile that converts the content to a string.
func AsStringArray(files ...string) ([]string, error) {
out := make([]string, 0, len(files))
for _, f := range files {
b, err := AsBytes(f)
if err != nil {
return nil, err
}
out = append(out, string(b))
}
return out, nil
}
// AsStringArrayOrFail calls AsStringOrFail and then converts to string.
func AsStringArrayOrFail(t test.Failer, files ...string) []string {
t.Helper()
out, err := AsStringArray(files...)
if err != nil {
t.Fatal(err)
}
return out
}
// AsString is a convenience wrapper around os.ReadFile that converts the content to a string.
func AsString(filename string) (string, error) {
b, err := AsBytes(filename)
if err != nil {
return "", err
}
return string(b), nil
}
// AsStringOrFail calls AsBytesOrFail and then converts to string.
func AsStringOrFail(t test.Failer, filename string) string {
t.Helper()
return string(AsBytesOrFail(t, filename))
}
// NormalizePath expands the homedir (~) and returns an error if the file doesn't exist.
func NormalizePath(originalPath string) (string, error) {
if originalPath == "" {
return "", nil
}
// trim leading/trailing spaces from the path and if it uses the homedir ~, expand it.
var err error
out := strings.TrimSpace(originalPath)
out, err = homedir.Expand(out)
if err != nil {
return "", err
}
// Verify that the file exists.
if _, err := os.Stat(out); os.IsNotExist(err) {
return "", fmt.Errorf("failed normalizing file %s: %v", originalPath, err)
}
return out, nil
}
// ReadTarFile reads a tar compress file from the embedded
func ReadTarFile(filePath string) (string, error) {
b, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
tr := tar.NewReader(bytes.NewBuffer(b))
for {
hdr, err := tr.Next()
if err == io.EOF {
break // End of archive
}
if err != nil {
return "", err
}
if hdr.Name != strings.TrimSuffix(filepath.Base(filePath), filepath.Ext(filePath)) {
continue
}
contents, err := io.ReadAll(tr)
if err != nil {
return "", err
}
return string(contents), nil
}
return "", fmt.Errorf("file not found %v", filePath)
}
// ReadDir returns the names of all files in the given directory. This is not recursive.
// The base path is appended; for example, ReadDir("dir") -> ["dir/file1", "dir/folder1"]
func ReadDir(filePath string, extensions ...string) ([]string, error) {
dir, err := os.ReadDir(filePath)
if err != nil {
return nil, err
}
res := []string{}
for _, d := range dir {
matched := len(extensions) == 0 // If none are set, match anything
for _, ext := range extensions {
if filepath.Ext(d.Name()) == ext {
matched = true
break
}
}
if matched {
res = append(res, filepath.Join(filePath, d.Name()))
}
}
return res, nil
}
func ReadDirOrFail(t test.Failer, filePath string, extensions ...string) []string {
res, err := ReadDir(filePath, extensions...)
if err != nil {
t.Fatal(err)
}
return res
}