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
127 lines
4.2 KiB
Swift
127 lines
4.2 KiB
Swift
//
|
|
// Copyright 2022 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
import XCTest
|
|
@testable import SignalServiceKit
|
|
|
|
public class ChainedPromiseTest: SSKBaseTestSwift {
|
|
|
|
func testChainSingleVoidPromise() throws {
|
|
let chainedPromise = ChainedPromise<Void>()
|
|
|
|
let promise = chainedPromise.enqueue {
|
|
return .value(())
|
|
}
|
|
expectSuccess(promise, description: "", timeout: 0.1)
|
|
}
|
|
|
|
func testChainSingleValuePromise() throws {
|
|
let chainedPromise = ChainedPromise<String>(initialValue: "")
|
|
let promise = chainedPromise.enqueue(recoverValue: "fail") { _ in
|
|
.value("hello")
|
|
}
|
|
let value = expectSuccess(promise, description: "", timeout: 0.1)
|
|
XCTAssertEqual(value, "hello")
|
|
}
|
|
|
|
func testChainingPromiseSuccess() throws {
|
|
let chainedPromise = ChainedPromise<Void>()
|
|
|
|
let (firstPromise, firstFuture) = Promise<Void>.pending()
|
|
_ = chainedPromise.enqueue {
|
|
return firstPromise
|
|
}
|
|
|
|
let failIfExecuteSecondPromise = AtomicBool(true)
|
|
let (secondPromise, secondFuture) = Promise<Void>.pending()
|
|
let secondResultPromise = chainedPromise.enqueue {
|
|
XCTAssertFalse(failIfExecuteSecondPromise.get())
|
|
return secondPromise
|
|
}
|
|
|
|
failIfExecuteSecondPromise.set(false)
|
|
firstFuture.resolve(())
|
|
secondFuture.resolve(())
|
|
|
|
expectSuccess(secondResultPromise, description: "", timeout: 0.1)
|
|
}
|
|
|
|
func testChainingPromiseFailure() throws {
|
|
let chainedPromise = ChainedPromise<Void>()
|
|
|
|
let (firstPromise, firstFuture) = Promise<Void>.pending()
|
|
let firstResultPromise = chainedPromise.enqueue {
|
|
return firstPromise
|
|
}
|
|
|
|
let failIfExecuteSecondPromise = AtomicBool(true)
|
|
let (secondPromise, secondFuture) = Promise<Void>.pending()
|
|
let secondResultPromise = chainedPromise.enqueue {
|
|
XCTAssertFalse(failIfExecuteSecondPromise.get())
|
|
return secondPromise
|
|
}
|
|
|
|
failIfExecuteSecondPromise.set(false)
|
|
firstFuture.resolve(with: Promise<Void>.init(error: NSError()))
|
|
secondFuture.resolve(())
|
|
|
|
expectFailure(firstResultPromise, description: "first result failure", timeout: 0.1)
|
|
expectSuccess(secondResultPromise, description: "", timeout: 0.1)
|
|
}
|
|
|
|
func testChainingPromiseChainedValue() throws {
|
|
let chainedPromise = ChainedPromise<Int>(initialValue: 1)
|
|
|
|
let (firstPromise, firstFuture) = Promise<Int>.pending()
|
|
_ = chainedPromise.enqueue(recoverValue: -1) {
|
|
XCTAssertEqual($0, 1)
|
|
return firstPromise
|
|
}
|
|
|
|
let (secondPromise, secondFuture) = Promise<Int>.pending()
|
|
let secondResultPromise = chainedPromise.enqueue(recoverValue: -1) {
|
|
XCTAssertEqual($0, 2)
|
|
return secondPromise
|
|
}
|
|
|
|
firstFuture.resolve(2)
|
|
secondFuture.resolve(3)
|
|
|
|
XCTAssertEqual(expectSuccess(secondResultPromise, description: "", timeout: 0.1), 3)
|
|
}
|
|
|
|
func testChainingPromiseLongChain() throws {
|
|
let chainedPromise = ChainedPromise<Void>()
|
|
|
|
// Set an initial promise to gate the others
|
|
let (firstPromise, firstFuture) = Promise<Void>.pending()
|
|
let firstResultPromise = chainedPromise.enqueue {
|
|
return firstPromise
|
|
}
|
|
|
|
let hasResolvedUpTo = AtomicUInt(0)
|
|
var pendingFutures = [Future<Void>]()
|
|
var resultPromises = [Promise<Void>]()
|
|
(1...10).forEach { i in
|
|
let (promise, future) = Promise<Void>.pending()
|
|
resultPromises.append(chainedPromise.enqueue {
|
|
XCTAssertEqual(hasResolvedUpTo.get(), UInt(i - 1))
|
|
return promise
|
|
})
|
|
pendingFutures.append(future)
|
|
}
|
|
|
|
firstFuture.resolve(())
|
|
expectSuccess(firstResultPromise, description: "initial", timeout: 0.1)
|
|
|
|
pendingFutures.enumerated().forEach { i, future in
|
|
hasResolvedUpTo.set(UInt(i + 1))
|
|
future.resolve(())
|
|
expectSuccess(resultPromises[i], description: "\(i)-th promise", timeout: 0.1)
|
|
}
|
|
}
|
|
}
|