Skip to content

Commit

Permalink
Restructure main
Browse files Browse the repository at this point in the history
Add more tests

Signed-off-by: Christopher Meis <christopher.meis@9elements.com>
  • Loading branch information
ChriMarMe committed Nov 29, 2021
1 parent 28356b5 commit 4c3ccc1
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 25 deletions.
46 changes: 26 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,41 @@ 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 stdin == nil {
stdin = os.Stdin
}
if stdout == nil {
stdout = os.Stdout
}
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)
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 {
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:], nil, nil); err != nil {
log.Fatalf("cat failed with: %v", err)
}
}
81 changes: 76 additions & 5 deletions cmds/core/cat/cat_test.go
Expand Up @@ -50,12 +50,83 @@ 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)
if err := run(files, nil, nil); 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())
}
}

0 comments on commit 4c3ccc1

Please sign in to comment.