|
4 | 4 | package integration |
5 | 5 |
|
6 | 6 | import ( |
| 7 | + "bytes" |
7 | 8 | "context" |
8 | 9 | "io" |
9 | 10 | "os" |
@@ -139,6 +140,95 @@ func TestTopicDescribe(t *testing.T) { |
139 | 140 | require.Equal(t, expected, topicDesc) |
140 | 141 | } |
141 | 142 |
|
| 143 | +func TestTopicDescribePartitionStats(t *testing.T) { |
| 144 | + ctx := xtest.Context(t) |
| 145 | + db := connect(t) |
| 146 | + topicName := "test-topic-" + t.Name() |
| 147 | + |
| 148 | + var ( |
| 149 | + supportedCodecs = []topictypes.Codec{topictypes.CodecRaw} |
| 150 | + minActivePartitions = int64(1) |
| 151 | + ) |
| 152 | + |
| 153 | + _ = db.Topic().Drop(ctx, topicName) |
| 154 | + err := db.Topic().Create(ctx, topicName, |
| 155 | + topicoptions.CreateWithSupportedCodecs(supportedCodecs...), |
| 156 | + topicoptions.CreateWithMinActivePartitions(minActivePartitions), |
| 157 | + ) |
| 158 | + require.NoError(t, err) |
| 159 | + |
| 160 | + writer, err := db.Topic().StartWriter(topicName, topicoptions.WithWriterWaitServerAck(true)) |
| 161 | + require.NoError(t, err) |
| 162 | + topicMessage := topicwriter.Message{ |
| 163 | + Data: bytes.NewReader([]byte{128}), |
| 164 | + } |
| 165 | + err = writer.Write(ctx, topicMessage) |
| 166 | + require.NoError(t, err) |
| 167 | + |
| 168 | + topicDesc, err := db.Topic().Describe(ctx, topicName, topicoptions.IncludePartitionStats()) |
| 169 | + require.NoError(t, err) |
| 170 | + |
| 171 | + expected := topictypes.TopicDescription{ |
| 172 | + Path: topicName, |
| 173 | + PartitionSettings: topictypes.PartitionSettings{ |
| 174 | + MinActivePartitions: minActivePartitions, |
| 175 | + }, |
| 176 | + Partitions: []topictypes.PartitionInfo{ |
| 177 | + { |
| 178 | + PartitionID: 0, |
| 179 | + Active: true, |
| 180 | + PartitionStats: topictypes.PartitionStats{ |
| 181 | + PartitionsOffset: topictypes.OffsetRange{ |
| 182 | + Start: 0, |
| 183 | + End: 1, |
| 184 | + }, |
| 185 | + BytesWritten: topictypes.MultipleWindowsStat{ |
| 186 | + PerMinute: 1, |
| 187 | + PerHour: 1, |
| 188 | + PerDay: 1, |
| 189 | + }, |
| 190 | + }, |
| 191 | + }, |
| 192 | + }, |
| 193 | + RetentionPeriod: 86400000000000, |
| 194 | + RetentionStorageMB: 0, |
| 195 | + SupportedCodecs: supportedCodecs, |
| 196 | + PartitionWriteBurstBytes: 1048576, |
| 197 | + PartitionWriteSpeedBytesPerSecond: 1048576, |
| 198 | + Attributes: nil, |
| 199 | + Consumers: []topictypes.Consumer{}, |
| 200 | + MeteringMode: topictypes.MeteringModeUnspecified, |
| 201 | + } |
| 202 | + |
| 203 | + requireAndCleanSubset := func(checked *map[string]string, subset *map[string]string) { |
| 204 | + t.Helper() |
| 205 | + for k, subValue := range *subset { |
| 206 | + checkedValue, ok := (*checked)[k] |
| 207 | + require.True(t, ok, k) |
| 208 | + require.Equal(t, subValue, checkedValue) |
| 209 | + } |
| 210 | + *checked = nil |
| 211 | + *subset = nil |
| 212 | + } |
| 213 | + |
| 214 | + topicDesc.Partitions[0].PartitionStats.LastWriteTime = nil |
| 215 | + bw := &topicDesc.Partitions[0].PartitionStats.BytesWritten |
| 216 | + sign := func(x int64) int64 { |
| 217 | + if x > 0 { |
| 218 | + return 1 |
| 219 | + } |
| 220 | + return 0 |
| 221 | + } |
| 222 | + topicDesc.Partitions[0].PartitionStats.BytesWritten = topictypes.MultipleWindowsStat{ |
| 223 | + PerMinute: sign(bw.PerMinute), |
| 224 | + PerHour: sign(bw.PerHour), |
| 225 | + PerDay: sign(bw.PerDay), |
| 226 | + } |
| 227 | + |
| 228 | + requireAndCleanSubset(&topicDesc.Attributes, &expected.Attributes) |
| 229 | + require.Equal(t, expected, topicDesc) |
| 230 | +} |
| 231 | + |
142 | 232 | func TestDescribeTopicConsumer(t *testing.T) { |
143 | 233 | ctx := xtest.Context(t) |
144 | 234 | db := connect(t) |
|
0 commit comments