PodCommsSessionTests.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // PodCommsSessionTests.swift
  3. // OmniBLE
  4. //
  5. // Created by Pete Schwamb on 3/25/19.
  6. // Copyright © 2019 Pete Schwamb. All rights reserved.
  7. // From OmniKitTests/PodCommsSessionTests.swift
  8. //
  9. import Foundation
  10. import XCTest
  11. @testable import OmniBLE
  12. class MockMessageTransport: MessageTransport {
  13. var delegate: MessageTransportDelegate?
  14. var messageNumber: Int
  15. var responseMessageBlocks = [MessageBlock]()
  16. public var sentMessages = [Message]()
  17. var address: UInt32
  18. var sentMessageHandler: ((Message) -> Void)?
  19. init(address: UInt32, messageNumber: Int) {
  20. self.address = address
  21. self.messageNumber = messageNumber
  22. }
  23. func sendMessage(_ message: Message) throws -> Message {
  24. sentMessages.append(message)
  25. if responseMessageBlocks.isEmpty {
  26. throw PodCommsError.noResponse
  27. }
  28. return Message(address: address, messageBlocks: [responseMessageBlocks.removeFirst()], sequenceNum: messageNumber)
  29. }
  30. func addResponse(_ messageBlock: MessageBlock) {
  31. responseMessageBlocks.append(messageBlock)
  32. }
  33. func assertOnSessionQueue() {
  34. // Do nothing in tests
  35. }
  36. }
  37. class PodCommsSessionTests: XCTestCase, PodCommsSessionDelegate {
  38. var lastPodStateUpdate: PodState?
  39. let address: UInt32 = 521580830
  40. let fakeLtk = Data(hexadecimalString: "fedcba98765432100123456789abcdef")!
  41. var mockTransport: MockMessageTransport! = nil
  42. var podState: PodState! = nil
  43. override func setUp() {
  44. mockTransport = MockMessageTransport(address: address, messageNumber: 1)
  45. podState = PodState(address: address, ltk: fakeLtk, firmwareVersion: "2.7.0", bleFirmwareVersion: "2.7.0", lotNo: 43620, lotSeq: 560313, productId: dashProductId, bleIdentifier: "0000-0000", insulinType: .novolog)
  46. }
  47. func podCommsSession(_ podCommsSession: PodCommsSession, didChange state: PodState) {
  48. lastPodStateUpdate = state
  49. }
  50. func testBolusFinishedEarlyOnPodIsMarkedNonMutable() {
  51. let mockStart = Date()
  52. podState.unfinalizedBolus = UnfinalizedDose(bolusAmount: 4.45, startTime: mockStart, scheduledCertainty: .certain, insulinType: .novolog)
  53. let session = PodCommsSession(podState: podState, transport: mockTransport, delegate: self)
  54. // Simulate a status request a bit before the bolus is expected to finish
  55. let statusRequestTime = podState.unfinalizedBolus!.finishTime!.addingTimeInterval(-5)
  56. session.mockCurrentDate = statusRequestTime
  57. let statusResponse = StatusResponse(
  58. deliveryStatus: .scheduledBasal,
  59. podProgressStatus: .aboveFiftyUnits,
  60. timeActive: .minutes(10),
  61. reservoirLevel: Pod.reservoirLevelAboveThresholdMagicNumber,
  62. insulinDelivered: 25,
  63. bolusNotDelivered: 0,
  64. lastProgrammingMessageSeqNum: 5,
  65. alerts: AlertSet(slots: []))
  66. mockTransport.addResponse(statusResponse)
  67. let _ = try! session.getStatus()
  68. XCTAssertEqual(1, lastPodStateUpdate!.finalizedDoses.count)
  69. let finalizedBolus = lastPodStateUpdate!.finalizedDoses[0]
  70. XCTAssertTrue(finalizedBolus.isFinished(at: statusRequestTime))
  71. XCTAssertFalse(finalizedBolus.isMutable(at: statusRequestTime))
  72. }
  73. }