Skip to content

Commit 011885f

Browse files
committed
Add duplicate multi bar support and enforce .bar filename
1 parent c34fdf0 commit 011885f

File tree

2 files changed

+139
-2
lines changed

2 files changed

+139
-2
lines changed

internal/configuration/configuration.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"crypto/x509"
88
"encoding/base64"
99
"errors"
10+
"fmt"
1011
"io"
1112
"io/ioutil"
1213
"net/http"
@@ -584,11 +585,14 @@ func downloadBASIC_AUTH(log logger.LoggerInterface, basedir string, barAuthParse
584585
return err
585586
}
586587

587-
filename := "/home/aceuser/initial-config/bars/" + path.Base(req.URL.Path)
588+
var filename string
588589

589-
// temporarily override the bar name with "barfile.bar" if we only have ONE bar file until mq connector is fixed to support any bar name
590590
if len(urlArray) == 1 {
591+
// Temporarily override the bar name with "barfile.bar" if we only have ONE bar file until mq connector is fixed to support any bar name
591592
filename = "/home/aceuser/initial-config/bars/barfile.bar"
593+
} else {
594+
// Case where multiple bars. Need to check what file path is available
595+
filename = determineAvailableFilename(log, "/home/aceuser/initial-config/bars/"+path.Base(req.URL.Path))
592596
}
593597

594598
file, err := os.Create(filename)
@@ -625,3 +629,29 @@ func downloadBASIC_AUTH(log logger.LoggerInterface, basedir string, barAuthParse
625629
}
626630
return nil
627631
}
632+
633+
func determineAvailableFilename(log logger.LoggerInterface, basepath string) string {
634+
var filename string
635+
filenameBase := basepath
636+
// Initially strip off the .bar at the end if present
637+
if filenameBase[len(filenameBase)-4:] == ".bar" {
638+
filenameBase = filenameBase[:len(filenameBase)-4]
639+
}
640+
isAvailable := false
641+
count := 0
642+
for !isAvailable {
643+
if count == 0 {
644+
filename = filenameBase + ".bar"
645+
} else {
646+
filename = filenameBase + "-" + fmt.Sprint(count) + ".bar"
647+
log.Printf("Previous path already in use. Testing filename: " + filename)
648+
}
649+
650+
if _, err := osStat(filename); os.IsNotExist(err) {
651+
log.Printf("No existing file on that path so continuing")
652+
isAvailable = true
653+
}
654+
count++
655+
}
656+
return filename
657+
}

internal/configuration/configuration_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,3 +928,110 @@ func TestSetupConfigurationsFilesInternal(t *testing.T) {
928928
// restore
929929
restore()
930930
}
931+
932+
func TestDetermineAvailableFilename(t *testing.T) {
933+
934+
var osStatRestore = osStat
935+
createdFiles := map[string]bool{}
936+
937+
var reset = func() {
938+
osStat = func(file string) (os.FileInfo, error) {
939+
if createdFiles[file] {
940+
return nil, os.ErrExist
941+
} else {
942+
return nil, os.ErrNotExist
943+
}
944+
}
945+
}
946+
947+
var restore = func() {
948+
osStat = osStatRestore
949+
}
950+
951+
reset()
952+
defer restore()
953+
954+
t.Run("No existing files just returns the path.bar when basepath has no .bar", func(t *testing.T) {
955+
createdFiles = map[string]bool{}
956+
filename := determineAvailableFilename(testLogger, "my_server/my_bar")
957+
assert.Equal(t, "my_server/my_bar.bar", filename)
958+
})
959+
960+
t.Run("No existing files just returns the path.bar when basepath already has .bar", func(t *testing.T) {
961+
createdFiles = map[string]bool{}
962+
filename := determineAvailableFilename(testLogger, "my_server/my_bar.bar")
963+
assert.Equal(t, "my_server/my_bar.bar", filename)
964+
})
965+
966+
t.Run("Multiple files with different base paths all save as normal", func(t *testing.T) {
967+
createdFiles = map[string]bool{}
968+
969+
filename1 := determineAvailableFilename(testLogger, "my_server/my_bar1")
970+
createdFiles[filename1] = true
971+
972+
filename2 := determineAvailableFilename(testLogger, "my_server/my_bar2")
973+
createdFiles[filename2] = true
974+
975+
filename3 := determineAvailableFilename(testLogger, "my_server2/my_bar")
976+
createdFiles[filename3] = true
977+
978+
assert.Equal(t, "my_server/my_bar1.bar", filename1)
979+
assert.Equal(t, "my_server/my_bar2.bar", filename2)
980+
assert.Equal(t, "my_server2/my_bar.bar", filename3)
981+
})
982+
983+
t.Run("Multiple files all the same basepath append an incrementing index with no .bar", func(t *testing.T) {
984+
createdFiles = map[string]bool{}
985+
basePath := "my_server/my_bar"
986+
987+
filename1 := determineAvailableFilename(testLogger, basePath)
988+
createdFiles[filename1] = true
989+
990+
filename2 := determineAvailableFilename(testLogger, basePath)
991+
createdFiles[filename2] = true
992+
993+
filename3 := determineAvailableFilename(testLogger, basePath)
994+
createdFiles[filename3] = true
995+
996+
assert.Equal(t, "my_server/my_bar.bar", filename1)
997+
assert.Equal(t, "my_server/my_bar-1.bar", filename2)
998+
assert.Equal(t, "my_server/my_bar-2.bar", filename3)
999+
})
1000+
1001+
t.Run("Multiple files all the same basepath append an incrementing index and already have a .bar", func(t *testing.T) {
1002+
createdFiles = map[string]bool{}
1003+
basePath := "my_server/my_bar.bar"
1004+
1005+
filename1 := determineAvailableFilename(testLogger, basePath)
1006+
createdFiles[filename1] = true
1007+
1008+
filename2 := determineAvailableFilename(testLogger, basePath)
1009+
createdFiles[filename2] = true
1010+
1011+
filename3 := determineAvailableFilename(testLogger, basePath)
1012+
createdFiles[filename3] = true
1013+
1014+
assert.Equal(t, "my_server/my_bar.bar", filename1)
1015+
assert.Equal(t, "my_server/my_bar-1.bar", filename2)
1016+
assert.Equal(t, "my_server/my_bar-2.bar", filename3)
1017+
})
1018+
1019+
t.Run("Multiple files all the same basepath append an incrementing index with mixed present and missing .bar", func(t *testing.T) {
1020+
createdFiles = map[string]bool{}
1021+
basePath := "my_server/my_bar.bar"
1022+
basePathBar := "my_server/my_bar"
1023+
1024+
filename1 := determineAvailableFilename(testLogger, basePath)
1025+
createdFiles[filename1] = true
1026+
1027+
filename2 := determineAvailableFilename(testLogger, basePathBar)
1028+
createdFiles[filename2] = true
1029+
1030+
filename3 := determineAvailableFilename(testLogger, basePath)
1031+
createdFiles[filename3] = true
1032+
1033+
assert.Equal(t, "my_server/my_bar.bar", filename1)
1034+
assert.Equal(t, "my_server/my_bar-1.bar", filename2)
1035+
assert.Equal(t, "my_server/my_bar-2.bar", filename3)
1036+
})
1037+
}

0 commit comments

Comments
 (0)