github.com/Jeffail/benthos/v3@v3.65.0/lib/input/reader/files_test.go (about)

     1  package reader
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"path"
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/Jeffail/benthos/v3/lib/response"
    11  	"github.com/Jeffail/benthos/v3/lib/types"
    12  )
    13  
    14  //------------------------------------------------------------------------------
    15  
    16  func TestFilesDirectory(t *testing.T) {
    17  	tmpDir := t.TempDir()
    18  
    19  	tmpInnerDir, err := os.MkdirTemp(tmpDir, "benthos_inner")
    20  	if err != nil {
    21  		t.Fatal(err)
    22  	}
    23  
    24  	var tmpFile *os.File
    25  	if tmpFile, err = os.CreateTemp(tmpDir, "f1"); err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	defer os.Remove(tmpFile.Name())
    29  	if _, err = tmpFile.WriteString("foo"); err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	if err = tmpFile.Close(); err != nil {
    33  		t.Fatal(err)
    34  	}
    35  
    36  	if tmpFile, err = os.CreateTemp(tmpInnerDir, "f2"); err != nil {
    37  		t.Fatal(err)
    38  	}
    39  	if _, err = tmpFile.WriteString("bar"); err != nil {
    40  		t.Fatal(err)
    41  	}
    42  	if err = tmpFile.Close(); err != nil {
    43  		t.Fatal(err)
    44  	}
    45  
    46  	exp := map[string]struct{}{
    47  		"foo": {},
    48  		"bar": {},
    49  	}
    50  	act := map[string]struct{}{}
    51  
    52  	conf := NewFilesConfig()
    53  	conf.Path = tmpDir
    54  
    55  	var f Type
    56  	if f, err = NewFiles(conf); err != nil {
    57  		t.Fatal(err)
    58  	}
    59  
    60  	if err = f.Connect(); err != nil {
    61  		t.Error(err)
    62  	}
    63  
    64  	var msg types.Message
    65  	if msg, err = f.Read(); err != nil {
    66  		t.Error(err)
    67  	} else {
    68  		resStr := string(msg.Get(0).Get())
    69  		if _, exists := act[resStr]; exists {
    70  			t.Errorf("Received duplicate message: %v", resStr)
    71  		}
    72  		act[resStr] = struct{}{}
    73  	}
    74  	if msg, err = f.Read(); err != nil {
    75  		t.Error(err)
    76  	} else {
    77  		resStr := string(msg.Get(0).Get())
    78  		if _, exists := act[resStr]; exists {
    79  			t.Errorf("Received duplicate message: %v", resStr)
    80  		}
    81  		act[resStr] = struct{}{}
    82  	}
    83  	if _, err = f.Read(); err != types.ErrTypeClosed {
    84  		t.Error(err)
    85  	}
    86  
    87  	if !reflect.DeepEqual(exp, act) {
    88  		t.Errorf("Wrong result: %v != %v", act, exp)
    89  	}
    90  }
    91  
    92  func TestFilesFile(t *testing.T) {
    93  	tmpFile, err := os.CreateTemp("", "f1")
    94  	if err != nil {
    95  		t.Fatal(err)
    96  	}
    97  	defer os.Remove(tmpFile.Name())
    98  	if _, err = tmpFile.WriteString("foo"); err != nil {
    99  		t.Fatal(err)
   100  	}
   101  	if err = tmpFile.Close(); err != nil {
   102  		t.Fatal(err)
   103  	}
   104  
   105  	exp := map[string]struct{}{
   106  		"foo": {},
   107  	}
   108  	act := map[string]struct{}{}
   109  
   110  	conf := NewFilesConfig()
   111  	conf.Path = tmpFile.Name()
   112  
   113  	var f *Files
   114  	if f, err = NewFiles(conf); err != nil {
   115  		t.Fatal(err)
   116  	}
   117  
   118  	if err = f.Connect(); err != nil {
   119  		t.Error(err)
   120  	}
   121  
   122  	var msg types.Message
   123  	var ackFn AsyncAckFn
   124  	if msg, ackFn, err = f.ReadWithContext(context.Background()); err != nil {
   125  		t.Error(err)
   126  	} else {
   127  		resStr := string(msg.Get(0).Get())
   128  		if _, exists := act[resStr]; exists {
   129  			t.Errorf("Received duplicate message: %v", resStr)
   130  		}
   131  		act[resStr] = struct{}{}
   132  		if err = ackFn(context.Background(), response.NewAck()); err != nil {
   133  			t.Error(err)
   134  		}
   135  	}
   136  	if _, err = f.Read(); err != types.ErrTypeClosed {
   137  		t.Error(err)
   138  	}
   139  
   140  	if !reflect.DeepEqual(exp, act) {
   141  		t.Errorf("Wrong result: %v != %v", act, exp)
   142  	}
   143  }
   144  
   145  func TestFilesBadPath(t *testing.T) {
   146  	conf := NewFilesConfig()
   147  	conf.Path = "fdgdfkte34%#@$%#$%KL@#K$@:L#$23k;32l;23"
   148  
   149  	if _, err := NewFiles(conf); err == nil {
   150  		t.Error("Expected error from bad path")
   151  	}
   152  }
   153  
   154  func TestFilesDirectoryDelete(t *testing.T) {
   155  	tmpDir := t.TempDir()
   156  
   157  	tmpFile, err := os.CreateTemp(tmpDir, "f1")
   158  	if err != nil {
   159  		t.Fatal(err)
   160  	}
   161  	if _, err = tmpFile.WriteString("foo"); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  	if err = tmpFile.Close(); err != nil {
   165  		t.Fatal(err)
   166  	}
   167  
   168  	exp := map[string]struct{}{
   169  		"foo": {},
   170  	}
   171  	act := map[string]struct{}{}
   172  
   173  	conf := NewFilesConfig()
   174  	conf.Path = tmpDir
   175  	conf.DeleteFiles = true
   176  
   177  	var f Type
   178  	if f, err = NewFiles(conf); err != nil {
   179  		t.Fatal(err)
   180  	}
   181  
   182  	if err = f.Connect(); err != nil {
   183  		t.Error(err)
   184  	}
   185  
   186  	var msg types.Message
   187  	if msg, err = f.Read(); err != nil {
   188  		t.Error(err)
   189  	} else {
   190  		resStr := string(msg.Get(0).Get())
   191  		if _, exists := act[resStr]; exists {
   192  			t.Errorf("Received duplicate message: %v", resStr)
   193  		}
   194  		act[resStr] = struct{}{}
   195  	}
   196  	if _, err = f.Read(); err != types.ErrTypeClosed {
   197  		t.Error(err)
   198  	}
   199  
   200  	if _, err := os.Stat(path.Join(tmpDir, "f1")); err != nil {
   201  		if !os.IsNotExist(err) {
   202  			t.Errorf("Expected deleted file, received: %v", err)
   203  		}
   204  	} else {
   205  		t.Error("Expected deleted file")
   206  	}
   207  
   208  	if !reflect.DeepEqual(exp, act) {
   209  		t.Errorf("Wrong result: %v != %v", act, exp)
   210  	}
   211  }
   212  
   213  //------------------------------------------------------------------------------