Skip to content

Commit 6b39f3c

Browse files
authored
Update dependencies &. basic test suite (v1.0.3) (#1)
1 parent 4454506 commit 6b39f3c

6 files changed

Lines changed: 217 additions & 60 deletions

File tree

.github/workflows/ci.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: ci
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
pull_request:
7+
branches: [ "main" ]
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Checkout
14+
uses: actions/checkout@v4
15+
- name: Set up Go
16+
uses: actions/setup-go@v5
17+
with:
18+
go-version-file: go.mod
19+
- name: Check formatting
20+
run: |
21+
go fmt ./...
22+
git diff --exit-code
23+
- name: Run tests
24+
run: go test ./...

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ tinyups3 [--partSize=MB] [--inputSize=bytes] s3://bucket/key
3030
cat largefile | tinyups3 --inputSize $(stat -c%s largefile) s3://...
3131
```
3232

33+
Note: On MacOS use `gstat` instead of the outdated `stat`.
34+
3335
## Building from source
3436

3537
```sh
@@ -38,6 +40,12 @@ GOOS=linux GOARCH=arm64 go build -o dist/arm64/tinyups3 .
3840

3941
## Development
4042

43+
### Running tests
44+
45+
```sh
46+
go test ./...
47+
```
48+
4149
### Formatting
4250

4351
Apply Go formatting:
@@ -55,3 +63,10 @@ go mod tidy
5563
go run main.go ...
5664
```
5765

66+
### Upgrading dependencies
67+
68+
```sh
69+
go get -u ./...
70+
go mod tidy
71+
```
72+

go.mod

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
module github.com/envirobly/tinyups3
22

3-
go 1.24.5
3+
go 1.25.5
44

55
require (
6-
github.com/aws/aws-sdk-go-v2/config v1.30.3
7-
github.com/aws/aws-sdk-go-v2/service/s3 v1.86.0
6+
github.com/aws/aws-sdk-go-v2/config v1.32.6
7+
github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0
88
)
99

1010
require (
11-
github.com/aws/aws-sdk-go-v2 v1.37.2 // indirect
12-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect
13-
github.com/aws/aws-sdk-go-v2/credentials v1.18.3 // indirect
14-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2 // indirect
15-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2 // indirect
16-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2 // indirect
17-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
18-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.2 // indirect
19-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect
20-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.2 // indirect
21-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2 // indirect
22-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.2 // indirect
23-
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0 // indirect
24-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0 // indirect
25-
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0 // indirect
26-
github.com/aws/smithy-go v1.22.5 // indirect
11+
github.com/aws/aws-sdk-go-v2 v1.41.0 // indirect
12+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
13+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 // indirect
14+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
15+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
16+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
17+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
18+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 // indirect
19+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 // indirect
21+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect
22+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 // indirect
23+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
25+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
26+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
27+
github.com/aws/smithy-go v1.24.0 // indirect
2728
)

go.sum

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
1-
github.com/aws/aws-sdk-go-v2 v1.37.2 h1:xkW1iMYawzcmYFYEV0UCMxc8gSsjCGEhBXQkdQywVbo=
2-
github.com/aws/aws-sdk-go-v2 v1.37.2/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg=
3-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg=
4-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg=
5-
github.com/aws/aws-sdk-go-v2/config v1.30.3 h1:utupeVnE3bmB221W08P0Moz1lDI3OwYa2fBtUhl7TCc=
6-
github.com/aws/aws-sdk-go-v2/config v1.30.3/go.mod h1:NDGwOEBdpyZwLPlQkpKIO7frf18BW8PaCmAM9iUxQmI=
7-
github.com/aws/aws-sdk-go-v2/credentials v1.18.3 h1:ptfyXmv+ooxzFwyuBth0yqABcjVIkjDL0iTYZBSbum8=
8-
github.com/aws/aws-sdk-go-v2/credentials v1.18.3/go.mod h1:Q43Nci++Wohb0qUh4m54sNln0dbxJw8PvQWkrwOkGOI=
9-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2 h1:nRniHAvjFJGUCl04F3WaAj7qp/rcz5Gi1OVoj5ErBkc=
10-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.2/go.mod h1:eJDFKAMHHUvv4a0Zfa7bQb//wFNUXGrbFpYRCHe2kD0=
11-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2 h1:sPiRHLVUIIQcoVZTNwqQcdtjkqkPopyYmIX0M5ElRf4=
12-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.2/go.mod h1:ik86P3sgV+Bk7c1tBFCwI3VxMoSEwl4YkRB9xn1s340=
13-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2 h1:ZdzDAg075H6stMZtbD2o+PyB933M/f20e9WmCBC17wA=
14-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.2/go.mod h1:eE1IIzXG9sdZCB0pNNpMpsYTLl4YdOQD3njiVN1e/E4=
15-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
16-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
17-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.2 h1:sBpc8Ph6CpfZsEdkz/8bfg8WhKlWMCms5iWj6W/AW2U=
18-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.2/go.mod h1:Z2lDojZB+92Wo6EKiZZmJid9pPrDJW2NNIXSlaEfVlU=
19-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM=
20-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44=
21-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.2 h1:blV3dY6WbxIVOFggfYIo2E1Q2lZoy5imS7nKgu5m6Tc=
22-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.2/go.mod h1:cBWNeLBjHJRSmXAxdS7mwiMUEgx6zup4wQ9J+/PcsRQ=
23-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2 h1:oxmDEO14NBZJbK/M8y3brhMFEIGN4j8a6Aq8eY0sqlo=
24-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.2/go.mod h1:4hH+8QCrk1uRWDPsVfsNDUup3taAjO8Dnx63au7smAU=
25-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.2 h1:0hBNFAPwecERLzkhhBY+lQKUMpXSKVv4Sxovikrioms=
26-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.2/go.mod h1:Vcnh4KyR4imrrjGN7A2kP2v9y6EPudqoPKXtnmBliPU=
27-
github.com/aws/aws-sdk-go-v2/service/s3 v1.86.0 h1:utPhv4ECQzJIUbtx7vMN4A8uZxlQ5tSt1H1toPI41h8=
28-
github.com/aws/aws-sdk-go-v2/service/s3 v1.86.0/go.mod h1:1/eZYtTWazDgVl96LmGdGktHFi7prAcGCrJ9JGvBITU=
29-
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0 h1:j7/jTOjWeJDolPwZ/J4yZ7dUsxsWZEsxNwH5O7F8eEA=
30-
github.com/aws/aws-sdk-go-v2/service/sso v1.27.0/go.mod h1:M0xdEPQtgpNT7kdAX4/vOAPkFj60hSQRb7TvW9B0iug=
31-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0 h1:ywQF2N4VjqX+Psw+jLjMmUL2g1RDHlvri3NxHA08MGI=
32-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.32.0/go.mod h1:Z+qv5Q6b7sWiclvbJyPSOT1BRVU9wfSUPaqQzZ1Xg3E=
33-
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0 h1:bRP/a9llXSSgDPk7Rqn5GD/DQCGo6uk95plBFKoXt2M=
34-
github.com/aws/aws-sdk-go-v2/service/sts v1.36.0/go.mod h1:tgBsFzxwl65BWkuJ/x2EUs59bD4SfYKgikvFDJi1S58=
35-
github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw=
36-
github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
1+
github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4=
2+
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
3+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
4+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
5+
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
6+
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
7+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
8+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
9+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
10+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=
11+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=
12+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=
13+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=
14+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=
15+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
16+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
17+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 h1:CjMzUs78RDDv4ROu3JnJn/Ig1r6ZD7/T2DXLLRpejic=
18+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16/go.mod h1:uVW4OLBqbJXSHJYA9svT9BluSvvwbzLQ2Crf6UPzR3c=
19+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
20+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
21+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 h1:DIBqIrJ7hv+e4CmIk2z3pyKT+3B6qVMgRsawHiR3qso=
22+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7/go.mod h1:vLm00xmBke75UmpNvOcZQ/Q30ZFjbczeLFqGx5urmGo=
23+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=
24+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=
25+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU=
26+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A=
27+
github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0 h1:MIWra+MSq53CFaXXAywB2qg9YvVZifkk6vEGl/1Qor0=
28+
github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8=
29+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
30+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
32+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
33+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=
37+
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
38+
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=

main.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ func parseS3URI(s3uri string) (bucket, key string, err error) {
3434
return bucket, key, nil
3535
}
3636

37+
func calculatePartsCount(inputSize int64, partSize int) int {
38+
if inputSize <= 0 || partSize <= 0 {
39+
return 0
40+
}
41+
partsCount := int(inputSize/int64(partSize)) + 1
42+
if inputSize%int64(partSize) == 0 {
43+
partsCount--
44+
}
45+
return partsCount
46+
}
47+
3748
func main() {
3849
// Define flags with input size
3950
partSizeMB := flag.Int("partSize", 5, "Part size in MB for multipart upload (min 5MB)")
@@ -83,10 +94,7 @@ func main() {
8394
})
8495

8596
// Calculate exact number of parts
86-
partsCount := int(*inputSize/int64(partSize)) + 1
87-
if *inputSize%int64(partSize) == 0 {
88-
partsCount--
89-
}
97+
partsCount := calculatePartsCount(*inputSize, partSize)
9098

9199
// Start multipart upload
92100
createOutput, err := client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{
@@ -99,7 +107,7 @@ func main() {
99107

100108
uploadID := createOutput.UploadId
101109
parts := make([]types.CompletedPart, 0, partsCount) // Preallocate slice
102-
buffer := make([]byte, partSize) // Single buffer allocation
110+
buffer := make([]byte, partSize) // Single buffer allocation
103111

104112
partNumber := int32(1)
105113
for {

main_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package main
2+
3+
import "testing"
4+
5+
func TestParseS3URI(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
uri string
9+
bucket string
10+
key string
11+
wantErr bool
12+
}{
13+
{
14+
name: "valid simple",
15+
uri: "s3://my-bucket/my-key",
16+
bucket: "my-bucket",
17+
key: "my-key",
18+
},
19+
{
20+
name: "valid nested key",
21+
uri: "s3://bucket/dir/file.txt",
22+
bucket: "bucket",
23+
key: "dir/file.txt",
24+
},
25+
{
26+
name: "missing scheme",
27+
uri: "https://bucket/key",
28+
wantErr: true,
29+
},
30+
{
31+
name: "missing bucket",
32+
uri: "s3:///key",
33+
wantErr: true,
34+
},
35+
{
36+
name: "missing key",
37+
uri: "s3://bucket/",
38+
wantErr: true,
39+
},
40+
{
41+
name: "missing bucket and key",
42+
uri: "s3://",
43+
wantErr: true,
44+
},
45+
}
46+
47+
for _, tt := range tests {
48+
t.Run(tt.name, func(t *testing.T) {
49+
bucket, key, err := parseS3URI(tt.uri)
50+
if tt.wantErr {
51+
if err == nil {
52+
t.Fatalf("expected error for %q", tt.uri)
53+
}
54+
return
55+
}
56+
if err != nil {
57+
t.Fatalf("unexpected error for %q: %v", tt.uri, err)
58+
}
59+
if bucket != tt.bucket || key != tt.key {
60+
t.Fatalf("got bucket=%q key=%q, want bucket=%q key=%q", bucket, key, tt.bucket, tt.key)
61+
}
62+
})
63+
}
64+
}
65+
66+
func TestCalculatePartsCount(t *testing.T) {
67+
tests := []struct {
68+
name string
69+
inputSize int64
70+
partSize int
71+
want int
72+
}{
73+
{
74+
name: "single byte",
75+
inputSize: 1,
76+
partSize: 5,
77+
want: 1,
78+
},
79+
{
80+
name: "exact multiple",
81+
inputSize: 10,
82+
partSize: 5,
83+
want: 2,
84+
},
85+
{
86+
name: "one over multiple",
87+
inputSize: 11,
88+
partSize: 5,
89+
want: 3,
90+
},
91+
{
92+
name: "exact one part",
93+
inputSize: 5,
94+
partSize: 5,
95+
want: 1,
96+
},
97+
}
98+
99+
for _, tt := range tests {
100+
t.Run(tt.name, func(t *testing.T) {
101+
got := calculatePartsCount(tt.inputSize, tt.partSize)
102+
if got != tt.want {
103+
t.Fatalf("got %d, want %d", got, tt.want)
104+
}
105+
})
106+
}
107+
}

0 commit comments

Comments
 (0)