157 lines
4.3 KiB
Go
157 lines
4.3 KiB
Go
package handlers_test
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"otaupdate/handlers"
|
|
"otaupdate/services"
|
|
"testing"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/db/queries/mocks"
|
|
"github.com/fiskerinc/cloud-services/pkg/s3"
|
|
smock "github.com/fiskerinc/cloud-services/pkg/s3/mock"
|
|
th "github.com/fiskerinc/cloud-services/pkg/testhelper"
|
|
)
|
|
|
|
func TestUpdateManifestFileAdd(t *testing.T) {
|
|
formData := `--XXXXXX
|
|
Content-Disposition: form-data; name="manifest_ecu_id"
|
|
|
|
1000
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="offset"
|
|
|
|
1111
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="version"
|
|
|
|
2000
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="checksum"
|
|
|
|
CE114E45
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="order"
|
|
|
|
1
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="type"
|
|
|
|
01 Bootloader
|
|
--XXXXXX
|
|
Content-Disposition: form-data; name="signature"
|
|
|
|
53e976bd61161e4f425186e560f0797767d10fd6f0116e224efc444fa014754cb299e51827468c03c9b06508740ed738b1ec14b9cc753a1875971e335408660e
|
|
`
|
|
|
|
missingFile := fmt.Sprintf(`%v--XXXXXX--
|
|
`, formData)
|
|
|
|
badFile := fmt.Sprintf(`%v--XXXXXX
|
|
Content-Disposition: form-data; name="file"; filename="test.txt"
|
|
Content-Type: text/plain
|
|
Content-Length: 0
|
|
|
|
--XXXXXX--
|
|
`, formData)
|
|
|
|
goodData := fmt.Sprintf(`%v--XXXXXX
|
|
Content-Disposition: form-data; name="file"; filename="test.txt"
|
|
Content-Type: text/plain
|
|
|
|
THIS IS A TEST FILE
|
|
--XXXXXX--
|
|
`, formData)
|
|
|
|
compare := th.JSONComparer{
|
|
IgnoreProps: []string{"file_id", "url"},
|
|
}
|
|
defer compare.Close()
|
|
|
|
type TestCase struct {
|
|
th.BasicHttpTest
|
|
hasFileContent bool
|
|
jsonCompare bool
|
|
}
|
|
|
|
tests := []TestCase{
|
|
{
|
|
BasicHttpTest: th.BasicHttpTest{
|
|
Name: "No data",
|
|
Request: th.MakeTestMultipartRequest("http://example.com/manifestfile", "", "XXXXXX", nil),
|
|
ExpectedStatus: http.StatusBadRequest,
|
|
ExpectedResponse: `{"message":"requires file","error":"Bad Request"}`,
|
|
},
|
|
hasFileContent: false,
|
|
},
|
|
{
|
|
BasicHttpTest: th.BasicHttpTest{
|
|
Name: "Good data",
|
|
Request: th.MakeTestMultipartRequest("http://example.com/manifestfile", goodData, "XXXXXX", nil),
|
|
ExpectedStatus: http.StatusOK,
|
|
ExpectedResponse: `{"file_id":"303ca940c940c645","manifest_ecu_id":1000,"filename":"test.txt","url":"https://upload-dev.fiskerdps.com/f453ae14-d89a-4e4f-9eae-fe7bcc456b55/test.txt","file_size":55,"checksum":"CE114E45","type":"bootloader","order":1,"write_region":{"offset":1111,"length":19}}`,
|
|
},
|
|
jsonCompare: true,
|
|
hasFileContent: true,
|
|
},
|
|
{
|
|
BasicHttpTest: th.BasicHttpTest{
|
|
Name: "Missing file",
|
|
Request: th.MakeTestMultipartRequest("http://example.com/manifestfile", missingFile, "XXXXXX", nil),
|
|
ExpectedStatus: http.StatusBadRequest,
|
|
ExpectedResponse: `{"message":"requires file","error":"Bad Request"}`,
|
|
},
|
|
hasFileContent: false,
|
|
},
|
|
{
|
|
BasicHttpTest: th.BasicHttpTest{
|
|
Name: "Bad file",
|
|
Request: th.MakeTestMultipartRequest("http://example.com/manifestfile", badFile, "XXXXXX", nil),
|
|
ExpectedStatus: http.StatusBadRequest,
|
|
ExpectedResponse: `{"message":"Length gt 0","error":"Bad Request"}`,
|
|
},
|
|
hasFileContent: false,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
setup()
|
|
w := th.ExecHTTPHandler(handlers.HandleUpdateManifestFileAdd, test.Request)
|
|
|
|
if w.Result().StatusCode != test.ExpectedStatus {
|
|
t.Errorf(th.TestErrorTemplate, test.Name, test.ExpectedStatus, w.Result().StatusCode)
|
|
}
|
|
|
|
if !test.jsonCompare && w.Body.String() != test.ExpectedResponse {
|
|
t.Errorf(th.TestErrorTemplate, test.Name, test.ExpectedResponse, w.Body.String())
|
|
}
|
|
|
|
if test.jsonCompare {
|
|
diff, err := compare.GetDiff([]byte(test.ExpectedResponse), w.Body.Bytes())
|
|
if err != nil {
|
|
t.Errorf(th.TestErrorTemplate, test.Name, nil, err)
|
|
}
|
|
for key, value := range diff {
|
|
body := w.Body.String()
|
|
fmt.Println(body)
|
|
t.Errorf(th.TestErrorTemplate, test.Name, key, value)
|
|
}
|
|
}
|
|
|
|
if test.hasFileContent {
|
|
s3 := s3.GetS3().(*smock.S3Mock)
|
|
content := string(s3.GetData())
|
|
if len(content) == 0 {
|
|
t.Errorf(th.TestErrorTemplate, test.Name, test.hasFileContent, fmt.Sprintf("Content size %v", len(content)))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func setup() {
|
|
// Setup mocks
|
|
s3.SetS3Instance(&smock.S3Mock{})
|
|
services.GetDB().SetFileKeys(&mocks.MockFileKeys{})
|
|
services.GetDB().SetUpdateManifests(&mocks.MockUpdateManifests{})
|
|
}
|