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.
		
		
		
		
		
			
		
			
				
					
					
						
							292 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							292 lines
						
					
					
						
							5.1 KiB
						
					
					
				
								package shell
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"bytes"
							 | 
						|
									"encoding/json"
							 | 
						|
									"reflect"
							 | 
						|
									"strings"
							 | 
						|
									"testing"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								type Case struct {
							 | 
						|
									args   []string
							 | 
						|
									result string
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								var (
							 | 
						|
									TestCases = []*Case{
							 | 
						|
										//add circuit breaker config for global
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-global -type Count -actions Read,Write -values 500,200", " "),
							 | 
						|
											result: `{
							 | 
						|
												"global": {
							 | 
						|
													"enabled": true,
							 | 
						|
													"actions": {
							 | 
						|
														"Read:Count": "500",
							 | 
						|
														"Write:Count": "200"
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//disable global config
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-global -disable", " "),
							 | 
						|
											result: `{
							 | 
						|
												"global": {
							 | 
						|
													"actions": {
							 | 
						|
														"Read:Count": "500",
							 | 
						|
														"Write:Count": "200"
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//add circuit breaker config for buckets x,y,z
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-buckets x,y,z -type Count -actions Read,Write -values 200,100", " "),
							 | 
						|
											result: `{
							 | 
						|
												"global": {
							 | 
						|
													"actions": {
							 | 
						|
														"Read:Count": "500",
							 | 
						|
														"Write:Count": "200"
							 | 
						|
													}
							 | 
						|
												},
							 | 
						|
												"buckets": {
							 | 
						|
													"x": {
							 | 
						|
														"enabled": true,
							 | 
						|
														"actions": {
							 | 
						|
															"Read:Count": "200",
							 | 
						|
															"Write:Count": "100"
							 | 
						|
														}
							 | 
						|
													},
							 | 
						|
													"y": {
							 | 
						|
														"enabled": true,
							 | 
						|
														"actions": {
							 | 
						|
															"Read:Count": "200",
							 | 
						|
															"Write:Count": "100"
							 | 
						|
														}
							 | 
						|
													},
							 | 
						|
													"z": {
							 | 
						|
														"enabled": true,
							 | 
						|
														"actions": {
							 | 
						|
															"Read:Count": "200",
							 | 
						|
															"Write:Count": "100"
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//disable circuit breaker config of x
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-buckets x -disable", " "),
							 | 
						|
											result: `{
							 | 
						|
											  "global": {
							 | 
						|
												"actions": {
							 | 
						|
												  "Read:Count": "500",
							 | 
						|
												  "Write:Count": "200"
							 | 
						|
												}
							 | 
						|
											  },
							 | 
						|
											  "buckets": {
							 | 
						|
												"x": {
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"y": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"z": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												}
							 | 
						|
											  }
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//delete circuit breaker config of x
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-buckets x -delete", " "),
							 | 
						|
											result: `{
							 | 
						|
											  "global": {
							 | 
						|
												"actions": {
							 | 
						|
												  "Read:Count": "500",
							 | 
						|
												  "Write:Count": "200"
							 | 
						|
												}
							 | 
						|
											  },
							 | 
						|
											  "buckets": {
							 | 
						|
												"y": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"z": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												}
							 | 
						|
											  }
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//configure the circuit breaker for the size of the uploaded file for bucket x,y
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-buckets x,y -type MB -actions Write -values 1024", " "),
							 | 
						|
											result: `{
							 | 
						|
											  "global": {
							 | 
						|
												"actions": {
							 | 
						|
												  "Read:Count": "500",
							 | 
						|
												  "Write:Count": "200"
							 | 
						|
												}
							 | 
						|
											  },
							 | 
						|
											  "buckets": {
							 | 
						|
												"x": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Write:MB": "1073741824"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"y": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100",
							 | 
						|
													"Write:MB": "1073741824"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"z": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												}
							 | 
						|
											  }
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//delete the circuit breaker configuration for the size of the uploaded file of bucket x,y
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-buckets x,y -type MB -actions Write -delete", " "),
							 | 
						|
											result: `{
							 | 
						|
											  "global": {
							 | 
						|
												"actions": {
							 | 
						|
												  "Read:Count": "500",
							 | 
						|
												  "Write:Count": "200"
							 | 
						|
												}
							 | 
						|
											  },
							 | 
						|
											  "buckets": {
							 | 
						|
												"x": {
							 | 
						|
												  "enabled": true
							 | 
						|
												},
							 | 
						|
												"y": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"z": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												}
							 | 
						|
											  }
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//enable global circuit breaker config (without -disable flag)
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-global", " "),
							 | 
						|
											result: `{
							 | 
						|
											  "global": {
							 | 
						|
												"enabled": true,
							 | 
						|
												"actions": {
							 | 
						|
												  "Read:Count": "500",
							 | 
						|
												  "Write:Count": "200"
							 | 
						|
												}
							 | 
						|
											  },
							 | 
						|
											  "buckets": {
							 | 
						|
												"x": {
							 | 
						|
												  "enabled": true
							 | 
						|
												},
							 | 
						|
												"y": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												},
							 | 
						|
												"z": {
							 | 
						|
												  "enabled": true,
							 | 
						|
												  "actions": {
							 | 
						|
													"Read:Count": "200",
							 | 
						|
													"Write:Count": "100"
							 | 
						|
												  }
							 | 
						|
												}
							 | 
						|
											  }
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
								
							 | 
						|
										//clear all circuit breaker config
							 | 
						|
										{
							 | 
						|
											args: strings.Split("-delete", " "),
							 | 
						|
											result: `{
							 | 
						|
											
							 | 
						|
											}`,
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func TestCircuitBreakerShell(t *testing.T) {
							 | 
						|
									var writeBuf bytes.Buffer
							 | 
						|
									cmd := &commandS3CircuitBreaker{}
							 | 
						|
									LoadConfig = func(commandEnv *CommandEnv, dir string, file string, buf *bytes.Buffer) error {
							 | 
						|
										_, err := buf.Write(writeBuf.Bytes())
							 | 
						|
										if err != nil {
							 | 
						|
											return err
							 | 
						|
										}
							 | 
						|
										writeBuf.Reset()
							 | 
						|
										return nil
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									for i, tc := range TestCases {
							 | 
						|
										err := cmd.Do(tc.args, nil, &writeBuf)
							 | 
						|
										if err != nil {
							 | 
						|
											t.Fatal(err)
							 | 
						|
										}
							 | 
						|
										if i != 0 {
							 | 
						|
											result := writeBuf.String()
							 | 
						|
								
							 | 
						|
											actual := make(map[string]interface{})
							 | 
						|
											err := json.Unmarshal([]byte(result), &actual)
							 | 
						|
											if err != nil {
							 | 
						|
												t.Error(err)
							 | 
						|
											}
							 | 
						|
								
							 | 
						|
											expect := make(map[string]interface{})
							 | 
						|
											err = json.Unmarshal([]byte(result), &expect)
							 | 
						|
											if err != nil {
							 | 
						|
												t.Error(err)
							 | 
						|
											}
							 | 
						|
											if !reflect.DeepEqual(actual, expect) {
							 | 
						|
												t.Fatal("result of s3 circuit breaker shell command is unexpected!")
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 |