blob: 75d5a4c95a29de7ac0fd7a668f9c5a7ac08a4eb8 [file] [log] [blame]
// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'dart:math';
import 'package:auto_submit/request_handling/pubsub.dart';
import 'package:googleapis/pubsub/v1.dart';
class FakePubSub extends PubSub {
List<dynamic> messagesQueue = <dynamic>[];
// The iteration of `pull` API calls.
int iteration = -1;
// Number of messages in each Pub/Sub pull call. This mocks the API
// returning random number of messages each time.
int messageSize = 2;
@override
Future<void> publish(String topicName, dynamic json) async {
final String messageData = jsonEncode(json);
final List<int> messageBytes = utf8.encode(messageData);
final String messageBase64 = base64Encode(messageBytes);
messagesQueue.add(messageBase64);
}
@override
Future<PullResponse> pull(String subscription, int maxMessages) async {
// The list will be empty if there are no more messages available in the backlog.
final List<ReceivedMessage> receivedMessages = <ReceivedMessage>[];
iteration++;
if (messagesQueue.isNotEmpty) {
int i = iteration * messageSize;
// Returns only allowed max number of messages. The number should not be greater than
// `maxMessages`, the available messages, and the number allowed in each call. The
// last number is to mock real `pull` API call.
while (i < min(min(maxMessages, messagesQueue.length), (iteration + 1) * messageSize)) {
receivedMessages.add(
ReceivedMessage(
message: PubsubMessage(data: messagesQueue[i] as String, messageId: '$i'),
ackId: 'ackId_$i',
),
);
i++;
}
return PullResponse(receivedMessages: receivedMessages);
}
return PullResponse(receivedMessages: receivedMessages);
}
@override
Future<void> acknowledge(String subscription, String ackId) async {
if (messagesQueue.isNotEmpty) {
messagesQueue.removeAt(messagesQueue.length - 1);
}
}
}