Skip to content

Commit c5f38de

Browse files
committed
adding tests
1 parent 573c3e6 commit c5f38de

File tree

7 files changed

+739
-6
lines changed

7 files changed

+739
-6
lines changed
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.redis.autoscaler;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Builder;
45
import lombok.Data;
6+
import lombok.NoArgsConstructor;
57

68
@Data
79
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
812
public class LocalThroughputMeasurement {
913
private String region;
1014
private long readOperationsPerSecond;
1115
private long writeOperationsPerSecond;
12-
13-
}
16+
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.redis.autoscaler;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Builder;
45
import lombok.Data;
6+
import lombok.NoArgsConstructor;
57

68
@Builder
79
@Data
10+
@NoArgsConstructor
11+
@AllArgsConstructor
812
public class Region {
913
private String region;
1014
private LocalThroughputMeasurement localThroughputMeasurement;
11-
}
15+
}

autoscaler/redis-cloud-autoscaler/src/main/java/com/redis/autoscaler/ScaleRequest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import lombok.AllArgsConstructor;
56
import lombok.Builder;
67
import lombok.Data;
7-
import lombok.Getter;
8-
import lombok.Setter;
8+
import lombok.NoArgsConstructor;
99

1010
@JsonInclude(JsonInclude.Include.NON_NULL)
1111
@Builder
1212
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
1315
public class ScaleRequest {
1416
@Builder.Default
1517
@JsonIgnore
@@ -23,4 +25,4 @@ public String toString(){
2325
return String.format("ScaleRequest: datasetSizeInGb=%f, throughputMeasurement=%s",
2426
datasetSizeInGb, throughputMeasurement);
2527
}
26-
}
28+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package com.redis.autoscaler;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
/**
8+
* Tests for Active-Active CRDB (conflict-free replicated database) functionality
9+
* These tests validate the basic data models and functionality introduced to support
10+
* Active-Active databases in Redis Cloud
11+
*/
12+
public class CrdbFunctionalityTests {
13+
14+
@Test
15+
void testScaleRequestWithCRDBFlag() {
16+
ScaleRequest request = ScaleRequest.builder()
17+
.isCrdb(true)
18+
.datasetSizeInGb(1.5)
19+
.build();
20+
21+
assertTrue(request.isCrdb());
22+
assertEquals(1.5, request.getDatasetSizeInGb(), 0.001);
23+
}
24+
25+
@Test
26+
void testScaleRequestWithRegions() {
27+
// Create regions
28+
LocalThroughputMeasurement throughput1 = LocalThroughputMeasurement.builder()
29+
.readOperationsPerSecond(1500)
30+
.writeOperationsPerSecond(1500)
31+
.build();
32+
33+
Region region1 = Region.builder()
34+
.region("us-east-1")
35+
.localThroughputMeasurement(throughput1)
36+
.build();
37+
38+
// Create request with regions
39+
ScaleRequest request = ScaleRequest.builder()
40+
.isCrdb(true)
41+
.regions(new Region[]{region1})
42+
.build();
43+
44+
assertTrue(request.isCrdb());
45+
assertNotNull(request.getRegions());
46+
assertEquals(1, request.getRegions().length);
47+
assertEquals("us-east-1", request.getRegions()[0].getRegion());
48+
assertEquals(1500, request.getRegions()[0].getLocalThroughputMeasurement().getReadOperationsPerSecond());
49+
}
50+
51+
@Test
52+
void testActiveActiveFlagInDatabase() {
53+
// Test setting and getting activeActiveRedis flag
54+
RedisCloudDatabase db = new RedisCloudDatabase();
55+
assertFalse(db.isActiveActiveRedis()); // Default should be false
56+
57+
db.setActiveActiveRedis(true);
58+
assertTrue(db.isActiveActiveRedis());
59+
}
60+
61+
@Test
62+
void testCrdbDatabasesInMainDatabase() {
63+
// Create main database
64+
RedisCloudDatabase db = new RedisCloudDatabase();
65+
db.setDatabaseId(123);
66+
db.setName("active-active-db");
67+
db.setActiveActiveRedis(true);
68+
69+
// Create CRDB instances
70+
RedisCloudDatabase crdb1 = new RedisCloudDatabase();
71+
crdb1.setRegion("us-east-1");
72+
crdb1.setPrivateEndpoint("db-123-east.internal.example.com:12000");
73+
crdb1.setReadOperationsPerSecond(1500);
74+
75+
RedisCloudDatabase crdb2 = new RedisCloudDatabase();
76+
crdb2.setRegion("us-west-1");
77+
crdb2.setPrivateEndpoint("db-123-west.internal.example.com:12000");
78+
crdb2.setReadOperationsPerSecond(1500);
79+
80+
// Set CRDBs in main database
81+
db.setCrdbDatabases(new RedisCloudDatabase[]{crdb1, crdb2});
82+
83+
// Verify
84+
assertNotNull(db.getCrdbDatabases());
85+
assertEquals(2, db.getCrdbDatabases().length);
86+
assertEquals("us-east-1", db.getCrdbDatabases()[0].getRegion());
87+
assertEquals("us-west-1", db.getCrdbDatabases()[1].getRegion());
88+
assertEquals(1500, db.getCrdbDatabases()[0].getReadOperationsPerSecond());
89+
}
90+
91+
@Test
92+
void testLocalThroughputMeasurement() {
93+
LocalThroughputMeasurement measurement = LocalThroughputMeasurement.builder()
94+
.region("us-east-1")
95+
.readOperationsPerSecond(2000)
96+
.writeOperationsPerSecond(1000)
97+
.build();
98+
99+
assertEquals("us-east-1", measurement.getRegion());
100+
assertEquals(2000, measurement.getReadOperationsPerSecond());
101+
assertEquals(1000, measurement.getWriteOperationsPerSecond());
102+
}
103+
104+
@Test
105+
void testRegionBuilder() {
106+
LocalThroughputMeasurement throughput = LocalThroughputMeasurement.builder()
107+
.readOperationsPerSecond(2000)
108+
.writeOperationsPerSecond(1000)
109+
.build();
110+
111+
Region region = Region.builder()
112+
.region("us-west-1")
113+
.localThroughputMeasurement(throughput)
114+
.build();
115+
116+
assertEquals("us-west-1", region.getRegion());
117+
assertNotNull(region.getLocalThroughputMeasurement());
118+
assertEquals(2000, region.getLocalThroughputMeasurement().getReadOperationsPerSecond());
119+
assertEquals(1000, region.getLocalThroughputMeasurement().getWriteOperationsPerSecond());
120+
}
121+
}
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package com.redis.autoscaler;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.junit.jupiter.api.Assertions.*;
7+
8+
public class CrdbModelTests {
9+
10+
private final ObjectMapper objectMapper = new ObjectMapper();
11+
12+
@Test
13+
void testRegionSerialization() throws Exception {
14+
// Create a LocalThroughputMeasurement object
15+
LocalThroughputMeasurement throughput = LocalThroughputMeasurement.builder()
16+
.readOperationsPerSecond(1500)
17+
.writeOperationsPerSecond(1500)
18+
.build();
19+
20+
// Create a Region object
21+
Region region = Region.builder()
22+
.region("us-east-1")
23+
.localThroughputMeasurement(throughput)
24+
.build();
25+
26+
// Serialize to JSON
27+
String json = objectMapper.writeValueAsString(region);
28+
29+
// Verify JSON structure
30+
assertTrue(json.contains("\"region\":\"us-east-1\""));
31+
assertTrue(json.contains("\"localThroughputMeasurement\""));
32+
assertTrue(json.contains("\"readOperationsPerSecond\":1500"));
33+
assertTrue(json.contains("\"writeOperationsPerSecond\":1500"));
34+
35+
// Deserialize from JSON
36+
Region deserializedRegion = objectMapper.readValue(json, Region.class);
37+
38+
// Verify deserialized object
39+
assertEquals("us-east-1", deserializedRegion.getRegion());
40+
assertNotNull(deserializedRegion.getLocalThroughputMeasurement());
41+
assertEquals(1500, deserializedRegion.getLocalThroughputMeasurement().getReadOperationsPerSecond());
42+
assertEquals(1500, deserializedRegion.getLocalThroughputMeasurement().getWriteOperationsPerSecond());
43+
}
44+
45+
@Test
46+
void testLocalThroughputMeasurementSerialization() throws Exception {
47+
// Create a LocalThroughputMeasurement object
48+
LocalThroughputMeasurement throughput = LocalThroughputMeasurement.builder()
49+
.region("us-west-1")
50+
.readOperationsPerSecond(2000)
51+
.writeOperationsPerSecond(1000)
52+
.build();
53+
54+
// Serialize to JSON
55+
String json = objectMapper.writeValueAsString(throughput);
56+
57+
// Verify JSON structure
58+
assertTrue(json.contains("\"region\":\"us-west-1\""));
59+
assertTrue(json.contains("\"readOperationsPerSecond\":2000"));
60+
assertTrue(json.contains("\"writeOperationsPerSecond\":1000"));
61+
62+
// Deserialize from JSON
63+
LocalThroughputMeasurement deserializedThroughput = objectMapper.readValue(json, LocalThroughputMeasurement.class);
64+
65+
// Verify deserialized object
66+
assertEquals("us-west-1", deserializedThroughput.getRegion());
67+
assertEquals(2000, deserializedThroughput.getReadOperationsPerSecond());
68+
assertEquals(1000, deserializedThroughput.getWriteOperationsPerSecond());
69+
}
70+
71+
@Test
72+
void testScaleRequestWithRegions() throws Exception {
73+
// Create LocalThroughputMeasurement objects
74+
LocalThroughputMeasurement throughput1 = LocalThroughputMeasurement.builder()
75+
.readOperationsPerSecond(1500)
76+
.writeOperationsPerSecond(1500)
77+
.build();
78+
79+
LocalThroughputMeasurement throughput2 = LocalThroughputMeasurement.builder()
80+
.readOperationsPerSecond(1500)
81+
.writeOperationsPerSecond(1500)
82+
.build();
83+
84+
// Create Region objects
85+
Region region1 = Region.builder()
86+
.region("us-east-1")
87+
.localThroughputMeasurement(throughput1)
88+
.build();
89+
90+
Region region2 = Region.builder()
91+
.region("us-west-1")
92+
.localThroughputMeasurement(throughput2)
93+
.build();
94+
95+
// Create ScaleRequest with regions
96+
ScaleRequest request = ScaleRequest.builder()
97+
.isCrdb(true)
98+
.regions(new Region[]{region1, region2})
99+
.build();
100+
101+
// Serialize to JSON
102+
String json = objectMapper.writeValueAsString(request);
103+
104+
// Verify JSON structure (isCrdb should not be included as it's marked @JsonIgnore)
105+
assertFalse(json.contains("\"isCrdb\""));
106+
assertTrue(json.contains("\"regions\""));
107+
assertTrue(json.contains("\"region\":\"us-east-1\""));
108+
assertTrue(json.contains("\"region\":\"us-west-1\""));
109+
110+
// Deserialize from JSON
111+
ScaleRequest deserializedRequest = objectMapper.readValue(json, ScaleRequest.class);
112+
113+
// Verify deserialized object
114+
assertFalse(deserializedRequest.isCrdb()); // Default value is false
115+
assertNotNull(deserializedRequest.getRegions());
116+
assertEquals(2, deserializedRequest.getRegions().length);
117+
assertEquals("us-east-1", deserializedRequest.getRegions()[0].getRegion());
118+
assertEquals("us-west-1", deserializedRequest.getRegions()[1].getRegion());
119+
}
120+
121+
@Test
122+
void testRedisCloudDatabaseWithCRDB() {
123+
// Create CRDB instances
124+
RedisCloudDatabase crdb1 = new RedisCloudDatabase();
125+
crdb1.setRegion("us-east-1");
126+
crdb1.setPrivateEndpoint("db-123-east.internal.example.com:12000");
127+
crdb1.setReadOperationsPerSecond(1500);
128+
crdb1.setWriteOperationsPerSecond(1500);
129+
130+
RedisCloudDatabase crdb2 = new RedisCloudDatabase();
131+
crdb2.setRegion("us-west-1");
132+
crdb2.setPrivateEndpoint("db-123-west.internal.example.com:12000");
133+
crdb2.setReadOperationsPerSecond(1500);
134+
crdb2.setWriteOperationsPerSecond(1500);
135+
136+
// Create main database
137+
RedisCloudDatabase db = new RedisCloudDatabase();
138+
db.setDatabaseId(123);
139+
db.setName("active-active-db");
140+
db.setActiveActiveRedis(true);
141+
db.setCrdbDatabases(new RedisCloudDatabase[]{crdb1, crdb2});
142+
143+
// Verify properties
144+
assertTrue(db.isActiveActiveRedis());
145+
assertNotNull(db.getCrdbDatabases());
146+
assertEquals(2, db.getCrdbDatabases().length);
147+
assertEquals("us-east-1", db.getCrdbDatabases()[0].getRegion());
148+
assertEquals("us-west-1", db.getCrdbDatabases()[1].getRegion());
149+
assertEquals(1500, db.getCrdbDatabases()[0].getReadOperationsPerSecond());
150+
assertEquals(1500, db.getCrdbDatabases()[0].getWriteOperationsPerSecond());
151+
}
152+
}

0 commit comments

Comments
 (0)