Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cover/cmds/core/cat #2183

Merged
merged 1 commit into from Nov 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
40 changes: 20 additions & 20 deletions cmds/core/cat/cat.go
Expand Up @@ -16,6 +16,7 @@ package main

import (
"flag"
"fmt"
"io"
"log"
"os"
Expand All @@ -25,36 +26,35 @@ var (
_ = flag.Bool("u", false, "ignored")
)

func catFile(w io.Writer, file string) error {
f, err := os.Open(file)
if err != nil {
return err
func cat(reader io.Reader, writer io.Writer) error {
if _, err := io.Copy(writer, reader); err != nil {
return fmt.Errorf("error concatenating stdin to stdout: %v", err)
}
defer f.Close()

_, err = io.Copy(w, f)
return err
return nil
}

func cat(w io.Writer, files []string) error {
for _, name := range files {
if err := catFile(w, name); err != nil {
func run(args []string, stdin io.Reader, stdout io.Writer) error {
if len(args) == 0 {
if err := cat(stdin, stdout); err != nil {
return fmt.Errorf("error concatenating stdin to stdout: %v", err)
}
}
for _, file := range args {
f, err := os.Open(file)
ChriMarMe marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return err
}
if err := cat(f, stdout); err != nil {
return fmt.Errorf("failed to concatenate file %s to given writer", f.Name())
}
f.Close()
}
return nil
}

func main() {
flag.Parse()

if flag.NArg() == 0 {
ChriMarMe marked this conversation as resolved.
Show resolved Hide resolved
if _, err := io.Copy(os.Stdout, os.Stdin); err != nil {
log.Fatalf("error concatenating stdin to stdout: %v", err)
}
}

if err := cat(os.Stdout, flag.Args()); err != nil {
log.Fatalf("cat: %v", err)
if err := run(os.Args[1:], os.Stdin, os.Stdout); err != nil {
log.Fatalf("cat failed with: %v", err)
}
}
82 changes: 77 additions & 5 deletions cmds/core/cat/cat_test.go
Expand Up @@ -50,12 +50,84 @@ func TestCat(t *testing.T) {
for i := range someData {
files = append(files, fmt.Sprintf("%v%d", filepath.Join(dir, "file"), i))
}

var b bytes.Buffer
if err := cat(&b, files); err != nil {
var out bytes.Buffer
if err := run(files, nil, &out); err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(b.Bytes(), someData) {
t.Fatalf("Reading files failed: got %v, want %v", b.Bytes(), someData)

if !reflect.DeepEqual(out.Bytes(), someData) {
t.Fatalf("Reading files failed: got %v, want %v", out.Bytes(), someData)
}
}

func TestCatPipe(t *testing.T) {
var inputbuf bytes.Buffer
teststring := "testdata"
fmt.Fprintf(&inputbuf, "%s", teststring)

var out bytes.Buffer

if err := cat(&inputbuf, &out); err != nil {
t.Error(err)
}
if out.String() != teststring {
t.Errorf("CatPipe: Want %q Got: %q", teststring, out.String())
}
}

func TestRunFiles(t *testing.T) {
var files []string
someData := []byte{'l', 2, 3, 4, 'd'}

dir, err := setup(t, someData)
if err != nil {
t.Fatalf("setup has failed, %v", err)
}
defer os.RemoveAll(dir)

for i := range someData {
files = append(files, fmt.Sprintf("%v%d", filepath.Join(dir, "file"), i))
}

var out bytes.Buffer
if err := run(files, nil, &out); err != nil {
t.Error(err)
}
if !reflect.DeepEqual(out.Bytes(), someData) {
t.Fatalf("Reading files failed: got %v, want %v", out.Bytes(), someData)
}
}

func TestRunFilesError(t *testing.T) {
var files []string
someData := []byte{'l', 2, 3, 4, 'd'}

dir, err := setup(t, someData)
if err != nil {
t.Fatalf("setup has failed, %v", err)
}
defer os.RemoveAll(dir)

for i := range someData {
files = append(files, fmt.Sprintf("%v%d", filepath.Join(dir, "file"), i))
}
filenotexist := "testdata/doesnotexist.txt"
files = append(files, filenotexist)
var in, out bytes.Buffer
if err := run(files, &in, &out); err == nil {
t.Error("function run succeeded but should have failed")
}
}

func TestRunNoArgs(t *testing.T) {
var in, out bytes.Buffer
inputdata := "teststring"
fmt.Fprintf(&in, "%s", inputdata)
args := make([]string, 0)
if err := run(args, &in, &out); err != nil {
t.Error(err)
}
if out.String() != inputdata {
t.Errorf("Want: %q Got: %q", inputdata, out.String())
}
}