From 9f43659135c88dea371b07b04880d11cb642eff3 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sun, 1 Mar 2015 13:16:57 -0800 Subject: [PATCH] Add tests, add NewHeader() for populating Header and ValidateHeader() --- pkg/storage/donut/data/data_v1/data.go | 56 +++++++++++++++++++-- pkg/storage/donut/data/data_v1/data_test.go | 50 ++++++++++++++++++ 2 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 pkg/storage/donut/data/data_v1/data_test.go diff --git a/pkg/storage/donut/data/data_v1/data.go b/pkg/storage/donut/data/data_v1/data.go index ec5e7f0ee..8069bf9aa 100644 --- a/pkg/storage/donut/data/data_v1/data.go +++ b/pkg/storage/donut/data/data_v1/data.go @@ -1,16 +1,35 @@ +/* + * Mini Object Storage, (C) 2015 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package data_v1 import ( "bytes" "encoding/binary" "encoding/gob" + "fmt" "io" ) +type Metadata map[string]string + type DataHeader struct { Key string Part int - Metadata map[string]string + Metadata Metadata EncoderParams EncoderParams } @@ -28,15 +47,46 @@ type EncoderParams struct { Technique EncoderTechnique } -func Write(target io.Writer, header DataHeader, data io.Reader) error { +func NewHeader(key string, part int, metadata Metadata, encoderParams EncoderParams) DataHeader { + header := DataHeader{} + header.Key = key + header.Part = part + header.Metadata = metadata + header.EncoderParams = EncoderParams{ + Length: encoderParams.Length, + K: encoderParams.K, + M: encoderParams.M, + Technique: encoderParams.Technique, + } + return header +} + +func ValidateHeader(header DataHeader) bool { + if header.Key == "" || header.Part < 0 || len(header.Metadata) < 2 { + return false + } + + if header.EncoderParams.Length < 0 || header.EncoderParams.Technique > 1 { + return false + } + + return true +} + +func WriteData(target io.Writer, header DataHeader, data io.Reader) error { + if !ValidateHeader(header) { + return fmt.Errorf("Invalid header") + } + var headerBuffer bytes.Buffer // encode header encoder := gob.NewEncoder(&headerBuffer) encoder.Encode(header) // write length of header - if err := binary.Write(target, binary.LittleEndian, headerBuffer.Len()); err != nil { + if err := binary.Write(target, binary.LittleEndian, int64(headerBuffer.Len())); err != nil { return err } + // write encoded header if _, err := io.Copy(target, &headerBuffer); err != nil { return err diff --git a/pkg/storage/donut/data/data_v1/data_test.go b/pkg/storage/donut/data/data_v1/data_test.go new file mode 100644 index 000000000..d246b91cd --- /dev/null +++ b/pkg/storage/donut/data/data_v1/data_test.go @@ -0,0 +1,50 @@ +/* + * Mini Object Storage, (C) 2015 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package data_v1 + +import ( + "bytes" + "testing" + + . "gopkg.in/check.v1" +) + +func Test(t *testing.T) { TestingT(t) } + +type MySuite struct{} + +var _ = Suite(&MySuite{}) + +func (s *MySuite) TestSingleWrite(c *C) { + var testBuffer bytes.Buffer + testData := "Hello, World" + testLength := len(testData) + encoderParams := EncoderParams{ + Length: testLength, + K: 8, + M: 8, + Technique: CAUCHY, + } + metadata := make(Metadata) + metadata["Content-Type"] = "application/octet-stream" + metadata["Content-MD5"] = "testing" + + header := NewHeader("testobj", 0, metadata, encoderParams) + + err := WriteData(&testBuffer, header, bytes.NewBufferString(testData)) + c.Assert(err, IsNil) +}