You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							116 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							116 lines
						
					
					
						
							3.2 KiB
						
					
					
				| package topology | |
| 
 | |
| import ( | |
| 	"testing" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/super_block" | |
| ) | |
| 
 | |
| func TestVolumesBinaryState(t *testing.T) { | |
| 	vids := []needle.VolumeId{ | |
| 		needle.VolumeId(1), | |
| 		needle.VolumeId(2), | |
| 		needle.VolumeId(3), | |
| 		needle.VolumeId(4), | |
| 		needle.VolumeId(5), | |
| 	} | |
| 
 | |
| 	dns := []*DataNode{ | |
| 		&DataNode{ | |
| 			Ip:   "127.0.0.1", | |
| 			Port: 8081, | |
| 		}, | |
| 		&DataNode{ | |
| 			Ip:   "127.0.0.1", | |
| 			Port: 8082, | |
| 		}, | |
| 		&DataNode{ | |
| 			Ip:   "127.0.0.1", | |
| 			Port: 8083, | |
| 		}, | |
| 	} | |
| 
 | |
| 	rp, _ := super_block.NewReplicaPlacementFromString("002") | |
| 
 | |
| 	state_exist := NewVolumesBinaryState(readOnlyState, rp, ExistCopies()) | |
| 	state_exist.Add(vids[0], dns[0]) | |
| 	state_exist.Add(vids[0], dns[1]) | |
| 	state_exist.Add(vids[1], dns[2]) | |
| 	state_exist.Add(vids[2], dns[1]) | |
| 	state_exist.Add(vids[4], dns[1]) | |
| 	state_exist.Add(vids[4], dns[2]) | |
| 
 | |
| 	state_no := NewVolumesBinaryState(readOnlyState, rp, NoCopies()) | |
| 	state_no.Add(vids[0], dns[0]) | |
| 	state_no.Add(vids[0], dns[1]) | |
| 	state_no.Add(vids[3], dns[1]) | |
| 
 | |
| 	tests := []struct { | |
| 		name                    string | |
| 		state                   *volumesBinaryState | |
| 		expectResult            []bool | |
| 		update                  func() | |
| 		expectResultAfterUpdate []bool | |
| 	}{ | |
| 		{ | |
| 			name:         "mark true when copies exist", | |
| 			state:        state_exist, | |
| 			expectResult: []bool{true, true, true, false, true}, | |
| 			update: func() { | |
| 				state_exist.Remove(vids[0], dns[2]) | |
| 				state_exist.Remove(vids[1], dns[2]) | |
| 				state_exist.Remove(vids[3], dns[2]) | |
| 				state_exist.Remove(vids[4], dns[1]) | |
| 				state_exist.Remove(vids[4], dns[2]) | |
| 			}, | |
| 			expectResultAfterUpdate: []bool{true, false, true, false, false}, | |
| 		}, | |
| 		{ | |
| 			name:         "mark true when no copies exist", | |
| 			state:        state_no, | |
| 			expectResult: []bool{false, true, true, false, true}, | |
| 			update: func() { | |
| 				state_no.Remove(vids[0], dns[2]) | |
| 				state_no.Remove(vids[1], dns[2]) | |
| 				state_no.Add(vids[2], dns[1]) | |
| 				state_no.Remove(vids[3], dns[1]) | |
| 				state_no.Remove(vids[4], dns[2]) | |
| 			}, | |
| 			expectResultAfterUpdate: []bool{false, true, false, true, true}, | |
| 		}, | |
| 	} | |
| 	for _, test := range tests { | |
| 		t.Run(test.name, func(t *testing.T) { | |
| 			var result []bool | |
| 			for index, _ := range vids { | |
| 				result = append(result, test.state.IsTrue(vids[index])) | |
| 			} | |
| 			if len(result) != len(test.expectResult) { | |
| 				t.Fatalf("len(result) != len(expectResult), got %d, expected %d\n", | |
| 					len(result), len(test.expectResult)) | |
| 			} | |
| 			for index, val := range result { | |
| 				if val != test.expectResult[index] { | |
| 					t.Fatalf("result not matched, index %d, got %v, expected %v\n", | |
| 						index, val, test.expectResult[index]) | |
| 				} | |
| 			} | |
| 			test.update() | |
| 			var updateResult []bool | |
| 			for index, _ := range vids { | |
| 				updateResult = append(updateResult, test.state.IsTrue(vids[index])) | |
| 			} | |
| 			if len(updateResult) != len(test.expectResultAfterUpdate) { | |
| 				t.Fatalf("len(updateResult) != len(expectResultAfterUpdate), got %d, expected %d\n", | |
| 					len(updateResult), len(test.expectResultAfterUpdate)) | |
| 			} | |
| 			for index, val := range updateResult { | |
| 				if val != test.expectResultAfterUpdate[index] { | |
| 					t.Fatalf("update result not matched, index %d, got %v, expected %v\n", | |
| 						index, val, test.expectResultAfterUpdate[index]) | |
| 				} | |
| 			} | |
| 		}) | |
| 	} | |
| }
 |