|
| 1 | +package cmd |
| 2 | + |
| 3 | +import ( |
| 4 | + "HelixDB/common" |
| 5 | + "HelixDB/db" |
| 6 | + "errors" |
| 7 | + "reflect" |
| 8 | + "testing" |
| 9 | +) |
| 10 | + |
| 11 | +func TestConfigGet(t *testing.T) { |
| 12 | + // Reset config to defaults before testing |
| 13 | + db.ServerConfig.Set("hz", "1") |
| 14 | + db.ServerConfig.Set("active-expire-enabled", "yes") |
| 15 | + db.ServerConfig.Set("maxmemory", "0") |
| 16 | + |
| 17 | + tests := []struct { |
| 18 | + command common.Cmd |
| 19 | + want []byte |
| 20 | + wantErr error |
| 21 | + }{ |
| 22 | + // Valid GET |
| 23 | + {common.Cmd{Name: "CONFIG", Args: []string{"GET", "hz"}}, common.RespBulkStringArray([]string{"hz", "1"}), nil}, |
| 24 | + {common.Cmd{Name: "CONFIG", Args: []string{"GET", "active-expire-enabled"}}, common.RespBulkStringArray([]string{"active-expire-enabled", "yes"}), nil}, |
| 25 | + {common.Cmd{Name: "CONFIG", Args: []string{"GET", "maxmemory"}}, common.RespBulkStringArray([]string{"maxmemory", "0"}), nil}, |
| 26 | + // Unknown parameter |
| 27 | + {common.Cmd{Name: "CONFIG", Args: []string{"GET", "unknown"}}, common.RespError("unknown config parameter 'unknown'"), ErrUnknownConfigParam}, |
| 28 | + // Wrong number of arguments |
| 29 | + {common.Cmd{Name: "CONFIG", Args: []string{"GET"}}, common.RespError("wrong number of arguments for 'config' command"), common.ErrWrongNumberOfArgs}, |
| 30 | + } |
| 31 | + for _, test := range tests { |
| 32 | + got, gotErr := ConfigCmd(test.command) |
| 33 | + if !reflect.DeepEqual(got, test.want) || !errors.Is(gotErr, test.wantErr) { |
| 34 | + t.Errorf("ConfigCmd(%v) = %v, %v; want %v, %v", test.command, got, gotErr, test.want, test.wantErr) |
| 35 | + } |
| 36 | + } |
| 37 | +} |
| 38 | + |
| 39 | +func TestConfigSet(t *testing.T) { |
| 40 | + tests := []struct { |
| 41 | + command common.Cmd |
| 42 | + want []byte |
| 43 | + wantErr error |
| 44 | + }{ |
| 45 | + // Valid SET |
| 46 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "hz", "10"}}, []byte("+OK\r\n"), nil}, |
| 47 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "active-expire-enabled", "no"}}, []byte("+OK\r\n"), nil}, |
| 48 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "maxmemory", "1073741824"}}, []byte("+OK\r\n"), nil}, |
| 49 | + // Invalid value |
| 50 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "hz", "abc"}}, common.RespError("invalid value for config parameter 'hz'"), ErrInvalidConfigValue}, |
| 51 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "hz", "0"}}, common.RespError("invalid value for config parameter 'hz'"), ErrInvalidConfigValue}, |
| 52 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "active-expire-enabled", "maybe"}}, common.RespError("invalid value for config parameter 'active-expire-enabled'"), ErrInvalidConfigValue}, |
| 53 | + // Unknown parameter |
| 54 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "unknown", "value"}}, common.RespError("invalid value for config parameter 'unknown'"), ErrInvalidConfigValue}, |
| 55 | + // Wrong number of arguments |
| 56 | + {common.Cmd{Name: "CONFIG", Args: []string{"SET", "hz"}}, common.RespError("wrong number of arguments for 'config' command"), common.ErrWrongNumberOfArgs}, |
| 57 | + } |
| 58 | + for _, test := range tests { |
| 59 | + got, gotErr := ConfigCmd(test.command) |
| 60 | + if !reflect.DeepEqual(got, test.want) || !errors.Is(gotErr, test.wantErr) { |
| 61 | + t.Errorf("ConfigCmd(%v) = %v, %v; want %v, %v", test.command, got, gotErr, test.want, test.wantErr) |
| 62 | + } |
| 63 | + } |
| 64 | +} |
| 65 | + |
| 66 | +func TestConfigUnknownSubcommand(t *testing.T) { |
| 67 | + got, gotErr := ConfigCmd(common.Cmd{Name: "CONFIG", Args: []string{"REWRITE"}}) |
| 68 | + if !reflect.DeepEqual(got, common.RespError("unknown subcommand 'REWRITE' for 'config' command")) || !errors.Is(gotErr, ErrUnknownSubcommand) { |
| 69 | + t.Errorf("ConfigCmd REWRITE = %v, %v; want error response, ErrUnknownSubcommand", got, gotErr) |
| 70 | + } |
| 71 | +} |
| 72 | + |
| 73 | +func TestConfigSetThenGet(t *testing.T) { |
| 74 | + // Set hz to 5 and verify GET reflects it |
| 75 | + ConfigCmd(common.Cmd{Name: "CONFIG", Args: []string{"SET", "hz", "5"}}) |
| 76 | + got, _ := ConfigCmd(common.Cmd{Name: "CONFIG", Args: []string{"GET", "hz"}}) |
| 77 | + want := common.RespBulkStringArray([]string{"hz", "5"}) |
| 78 | + if !reflect.DeepEqual(got, want) { |
| 79 | + t.Errorf("CONFIG SET then GET: got %v, want %v", got, want) |
| 80 | + } |
| 81 | +} |
0 commit comments