Change license to AGPL
This commit:
- Updates the `LICENSE` file
- Start every file with something like:
// Copyright YEAR_FIRST_PUBLISHED Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
---
First, I removed existing license headers with this Ruby 3.1.2 script:
require 'set'
EXTENSIONS_TO_CHECK = Set['.h', '.hpp', '.cpp', '.m', '.mm', '.pch', '.swift']
same = 0
different = 0
all_files = `git ls-files`.lines.map { |line| line.strip }
all_files.each do |relative_path|
if relative_path == 'Pods'
next
end
unless EXTENSIONS_TO_CHECK.include? File.extname(relative_path)
next
end
path = File.expand_path(relative_path)
contents = File.read(path)
new_contents = contents.sub(/\/\/\n\/\/ Copyright .*\n\/\/\n\n/, '')
if contents == new_contents
same += 1
else
different += 1
end
File.write(path, new_contents)
end
puts "updated #{different} file(s), left #{same} untouched"
I'm sure this script could be improved, but it worked well enough.
Then, I created `Scripts/lint/lint-license-headers` and ran it to auto-
fix a lot of files. This changed the mode of some files, but I think
that's actually desirable. For example,
`SignalServiceKit/src/Util/AppContext.m` previously had a mode of
`0755/-rwxr-xr-x`, and it's now `0644/-rw-r--r--`.
Then I fixed some stragglers and updated the precommit script.
See [a similar change in the Desktop app][0].
[0]: 8bfaf598af
169 lines
4.7 KiB
Swift
169 lines
4.7 KiB
Swift
//
|
|
// Copyright 2018 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
import XCTest
|
|
|
|
@testable import SignalServiceKit
|
|
|
|
typealias TestJobRecord = SSKJobRecord
|
|
|
|
let kJobRecordLabel = "TestJobRecord"
|
|
class TestJobQueue: JobQueue {
|
|
|
|
// MARK: JobQueue
|
|
|
|
typealias DurableOperationType = TestDurableOperation
|
|
var jobRecordLabel: String = kJobRecordLabel
|
|
static var maxRetries: UInt = 1
|
|
public var runningOperations = AtomicArray<TestDurableOperation>()
|
|
var requiresInternet: Bool = false
|
|
let isEnabled: Bool = true
|
|
|
|
func setup() {
|
|
defaultSetup()
|
|
}
|
|
|
|
func didMarkAsReady(oldJobRecord: TestJobRecord, transaction: SDSAnyWriteTransaction) {
|
|
// no special handling
|
|
}
|
|
|
|
public var isSetup = AtomicBool(false)
|
|
|
|
let operationQueue = OperationQueue()
|
|
|
|
func operationQueue(jobRecord: TestJobRecord) -> OperationQueue {
|
|
return self.operationQueue
|
|
}
|
|
|
|
func buildOperation(jobRecord: TestJobRecord, transaction: SDSAnyReadTransaction) throws -> TestDurableOperation {
|
|
return TestDurableOperation(jobRecord: jobRecord, jobBlock: self.jobBlock)
|
|
}
|
|
|
|
// MARK:
|
|
|
|
var jobBlock: (JobRecordType) -> Void = { _ in /* noop */ }
|
|
init() { }
|
|
}
|
|
|
|
class TestDurableOperation: OWSOperation, DurableOperation {
|
|
|
|
// MARK: DurableOperation
|
|
|
|
var jobRecord: TestJobRecord
|
|
|
|
weak var durableOperationDelegate: TestJobQueue?
|
|
|
|
var operation: OWSOperation {
|
|
return self
|
|
}
|
|
|
|
// MARK:
|
|
|
|
var jobBlock: (TestJobRecord) -> Void
|
|
|
|
init(jobRecord: TestJobRecord, jobBlock: @escaping (TestJobRecord) -> Void) {
|
|
self.jobRecord = jobRecord
|
|
self.jobBlock = jobBlock
|
|
}
|
|
|
|
override func run() {
|
|
jobBlock(jobRecord)
|
|
self.reportSuccess()
|
|
}
|
|
}
|
|
|
|
class JobQueueTest: SSKBaseTestSwift {
|
|
// MARK:
|
|
|
|
func buildJobRecord() -> TestJobRecord {
|
|
return TestJobRecord(label: kJobRecordLabel)
|
|
}
|
|
|
|
// MARK:
|
|
|
|
#if BROKEN_TESTS
|
|
|
|
func test_setupMarksInProgressJobsAsReady() {
|
|
|
|
let dispatchGroup = DispatchGroup()
|
|
|
|
let jobQueue = TestJobQueue()
|
|
let jobRecord1 = buildJobRecord()
|
|
let jobRecord2 = buildJobRecord()
|
|
let jobRecord3 = buildJobRecord()
|
|
|
|
var runList: [TestJobRecord] = []
|
|
|
|
jobQueue.jobBlock = { jobRecord in
|
|
runList.append(jobRecord)
|
|
dispatchGroup.leave()
|
|
}
|
|
|
|
self.write { transaction in
|
|
jobQueue.add(jobRecord: jobRecord1, transaction: transaction)
|
|
jobQueue.add(jobRecord: jobRecord2, transaction: transaction)
|
|
jobQueue.add(jobRecord: jobRecord3, transaction: transaction)
|
|
}
|
|
dispatchGroup.enter()
|
|
dispatchGroup.enter()
|
|
dispatchGroup.enter()
|
|
|
|
let finder = AnyJobRecordFinder()
|
|
self.write { transaction in
|
|
XCTAssertEqual(3, finder.allRecords(label: kJobRecordLabel, status: .ready, transaction: transaction).count)
|
|
}
|
|
|
|
// start queue
|
|
jobQueue.setup()
|
|
|
|
if case .timedOut = dispatchGroup.wait(timeout: .now() + 1.0) {
|
|
XCTFail("timed out waiting for jobs")
|
|
}
|
|
|
|
// Normally an operation enqueued for a JobRecord by a JobQueue will mark itself as complete
|
|
// by deleting itself.
|
|
// For testing, the operations enqueued by the TestJobQueue do *not* delete themeselves upon
|
|
// completion, simulating an operation which never compeleted.
|
|
|
|
self.write { transaction in
|
|
XCTAssertEqual(0, finder.allRecords(label: kJobRecordLabel, status: .ready, transaction: transaction).count)
|
|
XCTAssertEqual(3, finder.allRecords(label: kJobRecordLabel, status: .running, transaction: transaction).count)
|
|
}
|
|
|
|
// Verify re-queue
|
|
jobQueue.isSetup.set(false)
|
|
jobQueue.setup()
|
|
|
|
self.write { transaction in
|
|
XCTAssertEqual(3, finder.allRecords(label: kJobRecordLabel, status: .ready, transaction: transaction).count)
|
|
XCTAssertEqual(0, finder.allRecords(label: kJobRecordLabel, status: .running, transaction: transaction).count)
|
|
}
|
|
|
|
let rerunGroup = DispatchGroup()
|
|
rerunGroup.enter()
|
|
rerunGroup.enter()
|
|
rerunGroup.enter()
|
|
|
|
var rerunList: [TestJobRecord] = []
|
|
jobQueue.jobBlock = { jobRecord in
|
|
rerunList.append(jobRecord)
|
|
rerunGroup.leave()
|
|
}
|
|
|
|
jobQueue.isSetup.set(true)
|
|
|
|
switch rerunGroup.wait(timeout: .now() + 1.0) {
|
|
case .timedOut:
|
|
XCTFail("timed out waiting for retry")
|
|
case .success:
|
|
// verify order maintained on requeue
|
|
XCTAssertEqual([jobRecord1, jobRecord2, jobRecord3].map { $0.uniqueId }, rerunList.map { $0.uniqueId })
|
|
}
|
|
}
|
|
|
|
#endif
|
|
}
|