mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
	
	
		
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| 
								 | 
							
								// Copyright (c) 2015-2021 MinIO, Inc.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// This file is part of MinIO Object Storage stack
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// This program is free software: you can redistribute it and/or modify
							 | 
						||
| 
								 | 
							
								// it under the terms of the GNU Affero General Public License as published by
							 | 
						||
| 
								 | 
							
								// the Free Software Foundation, either version 3 of the License, or
							 | 
						||
| 
								 | 
							
								// (at your option) any later version.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// This program is distributed in the hope that it will be useful
							 | 
						||
| 
								 | 
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								// GNU Affero General Public License for more details.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// You should have received a copy of the GNU Affero General Public License
							 | 
						||
| 
								 | 
							
								// along with this program.  If not, see <http://www.gnu.org/licenses/>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package cmd
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"bytes"
							 | 
						||
| 
								 | 
							
									"testing"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/tinylib/msgp/msgp"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// TestJEntryReadOldToNew1 - tests that adding the RemoteVersionID parameter to the
							 | 
						||
| 
								 | 
							
								// jentry struct does not cause unexpected errors when reading the serialized
							 | 
						||
| 
								 | 
							
								// old version into new version.
							 | 
						||
| 
								 | 
							
								func TestJEntryReadOldToNew1(t *testing.T) {
							 | 
						||
| 
								 | 
							
									readOldToNewCases := []struct {
							 | 
						||
| 
								 | 
							
										je  jentryV1
							 | 
						||
| 
								 | 
							
										exp jentry
							 | 
						||
| 
								 | 
							
									}{
							 | 
						||
| 
								 | 
							
										{jentryV1{"obj1", "tier1"}, jentry{"obj1", "", "tier1"}},
							 | 
						||
| 
								 | 
							
										{jentryV1{"obj1", ""}, jentry{"obj1", "", ""}},
							 | 
						||
| 
								 | 
							
										{jentryV1{"", "tier1"}, jentry{"", "", "tier1"}},
							 | 
						||
| 
								 | 
							
										{jentryV1{"", ""}, jentry{"", "", ""}},
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var b bytes.Buffer
							 | 
						||
| 
								 | 
							
									for _, item := range readOldToNewCases {
							 | 
						||
| 
								 | 
							
										bs, err := item.je.MarshalMsg(nil)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											t.Fatal(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										b.Write(bs)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mr := msgp.NewReader(&b)
							 | 
						||
| 
								 | 
							
									for i, item := range readOldToNewCases {
							 | 
						||
| 
								 | 
							
										var je jentry
							 | 
						||
| 
								 | 
							
										err := je.DecodeMsg(mr)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											t.Fatal(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if je != item.exp {
							 | 
						||
| 
								 | 
							
											t.Errorf("Case %d: Expected: %v Got: %v", i, item.exp, je)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// TestJEntryWriteNewToOldMix1 - tests that adding the RemoteVersionID parameter
							 | 
						||
| 
								 | 
							
								// to the jentry struct does not cause unexpected errors when writing. This
							 | 
						||
| 
								 | 
							
								// simulates the case when the active journal has entries in the older version
							 | 
						||
| 
								 | 
							
								// struct and due to errors new entries are added in the new version of the
							 | 
						||
| 
								 | 
							
								// struct.
							 | 
						||
| 
								 | 
							
								func TestJEntryWriteNewToOldMix1(t *testing.T) {
							 | 
						||
| 
								 | 
							
									oldStructVals := []jentryV1{
							 | 
						||
| 
								 | 
							
										{"obj1", "tier1"},
							 | 
						||
| 
								 | 
							
										{"obj2", "tier2"},
							 | 
						||
| 
								 | 
							
										{"obj3", "tier3"},
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									newStructVals := []jentry{
							 | 
						||
| 
								 | 
							
										{"obj4", "", "tier1"},
							 | 
						||
| 
								 | 
							
										{"obj5", "ver2", "tier2"},
							 | 
						||
| 
								 | 
							
										{"obj6", "", "tier3"},
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Write old struct version values followed by new version values.
							 | 
						||
| 
								 | 
							
									var b bytes.Buffer
							 | 
						||
| 
								 | 
							
									for _, item := range oldStructVals {
							 | 
						||
| 
								 | 
							
										bs, err := item.MarshalMsg(nil)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											t.Fatal(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										b.Write(bs)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									for _, item := range newStructVals {
							 | 
						||
| 
								 | 
							
										bs, err := item.MarshalMsg(nil)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											t.Fatal(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										b.Write(bs)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Read into new struct version and check.
							 | 
						||
| 
								 | 
							
									mr := msgp.NewReader(&b)
							 | 
						||
| 
								 | 
							
									for i := 0; i < len(oldStructVals)+len(newStructVals); i++ {
							 | 
						||
| 
								 | 
							
										var je jentry
							 | 
						||
| 
								 | 
							
										err := je.DecodeMsg(mr)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											t.Fatal(err)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										var expectedJe jentry
							 | 
						||
| 
								 | 
							
										if i < len(oldStructVals) {
							 | 
						||
| 
								 | 
							
											// For old struct values, the RemoteVersionID will be
							 | 
						||
| 
								 | 
							
											// empty
							 | 
						||
| 
								 | 
							
											expectedJe = jentry{
							 | 
						||
| 
								 | 
							
												ObjName:   oldStructVals[i].ObjName,
							 | 
						||
| 
								 | 
							
												VersionID: "",
							 | 
						||
| 
								 | 
							
												TierName:  oldStructVals[i].TierName,
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										} else {
							 | 
						||
| 
								 | 
							
											expectedJe = newStructVals[i-len(oldStructVals)]
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if expectedJe != je {
							 | 
						||
| 
								 | 
							
											t.Errorf("Case %d: Expected: %v, Got: %v", i, expectedJe, je)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |