| /* |
| * Copyright 2015-2016 IBM Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import XCTest |
| import OpenWhisk |
| |
| class NetworkUtilsDelegate: NSObject, URLSessionDelegate { |
| func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: (Foundation.URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { |
| |
| completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, URLCredential(forTrust: challenge.protectionSpace.serverTrust!)) |
| } |
| } |
| |
| class OpenWhiskTests: XCTestCase { |
| |
| let Timeout:TimeInterval = 100 // time to wait for whisk action to complete |
| |
| var apiKey: String? |
| var apiSecret: String? |
| |
| override func setUp() { |
| super.setUp() |
| |
| |
| if let config = Config.getAuthToken() { |
| apiKey = config.apiKey |
| apiSecret = config.apiSecret |
| } |
| |
| } |
| |
| override func tearDown() { |
| super.tearDown() |
| } |
| |
| |
| |
| func testWhiskParameterizedAction() { |
| |
| if let apiKey = apiKey, apiSecret = apiSecret { |
| // allow for self-signed certificates |
| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: NetworkUtilsDelegate(), delegateQueue:OperationQueue.main) |
| |
| let credentials = WhiskCredentials(accessKey: apiKey, accessToken: apiSecret) |
| let whisk = Whisk(credentials: credentials) |
| whisk.urlSession = session |
| |
| // setup for async testing |
| let expectation = self.expectation(withDescription: "Whisk Callback") |
| |
| do { |
| try whisk.invokeAction(name: "date", package: "util", namespace: "whisk.system", parameters: nil, hasResult: true, |
| callback: {(reply, error) in |
| |
| if let error = error { |
| if case let WhiskError.httpError(description, statusCode) = error { |
| |
| print("Error: \(description) statusCode: \(statusCode))") |
| |
| if statusCode != 401 && statusCode != 404 && statusCode != 408 && statusCode != 500 { |
| XCTFail("Error: \(description) statusCode: \(statusCode))") |
| } |
| |
| } |
| } |
| |
| if let reply = reply { |
| |
| print("Reply is \(reply)") |
| XCTAssertNotNil(reply["activationId"]) |
| let id = reply["activationId"] as! String |
| print("Got id \(id)") |
| } |
| |
| expectation.fulfill() |
| |
| |
| }) |
| } catch { |
| print(error) |
| XCTFail("Error invoking action \(error)") |
| } |
| |
| waitForExpectations(withTimeout: Timeout, handler: { error in |
| |
| if let error = error { |
| print("Error: \(error)") |
| } |
| }) |
| } else { |
| XCTFail("No credentials available to run test") |
| } |
| } |
| |
| func testWhiskQualifiedNameAction() { |
| |
| if let apiKey = apiKey, apiSecret = apiSecret { |
| // setup for async testing |
| let expectation = self.expectation(withDescription: "Whisk Callback") |
| // allow for self-signed certificates |
| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: NetworkUtilsDelegate(), delegateQueue:OperationQueue.main) |
| |
| let credentials = WhiskCredentials(accessKey: apiKey, accessToken: apiSecret) |
| let whisk = Whisk(credentials: credentials) |
| whisk.urlSession = session |
| do { |
| try whisk.invokeAction(qualifiedName: "/whisk.system/util/date", parameters: nil, hasResult: true, callback: {(reply, error) in |
| |
| if let error = error { |
| if case let WhiskError.httpError(description, statusCode) = error { |
| |
| print("Error: \(description) statusCode: \(statusCode))") |
| |
| if statusCode != 401 && statusCode != 404 && statusCode != 408 && statusCode != 500 { |
| XCTFail("Error: \(description) statusCode: \(statusCode))") |
| } |
| |
| } |
| } |
| |
| if let reply = reply { |
| |
| print("Reply is \(reply)") |
| XCTAssertNotNil(reply["activationId"]) |
| let id = reply["activationId"] as! String |
| print("Got id \(id)") |
| } |
| |
| expectation.fulfill() |
| |
| |
| }) |
| } catch { |
| print(error) |
| XCTFail("Error invoking action \(error)") |
| } |
| |
| waitForExpectations(withTimeout: Timeout, handler: { error in |
| |
| if let error = error { |
| print("Error: \(error)") |
| } |
| }) |
| } else { |
| XCTFail("No credentials available to run test") |
| } |
| } |
| |
| func testWhiskSettingBaseUrl() { |
| |
| if let apiKey = apiKey, apiSecret = apiSecret { |
| // setup for async testing |
| let expectation = self.expectation(withDescription: "Whisk Callback") |
| |
| // allow for self-signed certificates |
| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: NetworkUtilsDelegate(), delegateQueue:OperationQueue.main) |
| |
| let credentials = WhiskCredentials(accessKey: apiKey, accessToken: apiSecret) |
| let whisk = Whisk(credentials: credentials) |
| whisk.urlSession = session |
| |
| do { |
| whisk.baseURL = "https://openwhisk.ng.bluemix.net" |
| |
| try whisk.invokeAction(qualifiedName: "/whisk.system/util/date", parameters: nil, hasResult: true, callback: {(reply, error) in |
| |
| if let error = error { |
| if case let WhiskError.httpError(description, statusCode) = error { |
| |
| print("Error: \(description) statusCode: \(statusCode))") |
| |
| if statusCode != 401 && statusCode != 404 && statusCode != 408 && statusCode != 500 { |
| XCTFail("Error: \(description) statusCode: \(statusCode))") |
| } |
| |
| } |
| } |
| |
| if let reply = reply { |
| |
| print("Reply is \(reply)") |
| XCTAssertNotNil(reply["activationId"]) |
| let id = reply["activationId"] as! String |
| print("Got id \(id)") |
| } |
| |
| expectation.fulfill() |
| |
| |
| }) |
| } catch { |
| print(error) |
| XCTFail("Error invoking action \(error)") |
| } |
| |
| waitForExpectations(withTimeout: Timeout, handler: { error in |
| |
| if let error = error { |
| print("Error: \(error)") |
| } |
| }) |
| |
| } else { |
| XCTFail("No credentials available to run test") |
| } |
| } |
| |
| func testWhiskVerboseReplies() { |
| |
| if let apiKey = apiKey, apiSecret = apiSecret { |
| // setup for async testing |
| let expectation = self.expectation(withDescription: "Whisk Callback") |
| |
| // allow for self-signed certificates |
| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: NetworkUtilsDelegate(), delegateQueue:OperationQueue.main) |
| |
| let credentials = WhiskCredentials(accessKey: apiKey, accessToken: apiSecret) |
| let whisk = Whisk(credentials: credentials) |
| whisk.urlSession = session |
| whisk.baseURL = "https://openwhisk.ng.bluemix.net" |
| |
| do { |
| whisk.verboseReplies = true |
| |
| try whisk.invokeAction(qualifiedName: "/whisk.system/util/date", parameters: nil, hasResult: true, callback: {(reply, error) in |
| |
| if let error = error { |
| if case let WhiskError.httpError(description, statusCode) = error { |
| |
| print("Error: \(description) statusCode: \(statusCode))") |
| |
| if statusCode != 401 && statusCode != 404 && statusCode != 408 && statusCode != 500 { |
| XCTFail("Error: \(description) statusCode: \(statusCode))") |
| } |
| |
| } |
| } |
| |
| if let reply = reply { |
| |
| print("Reply is \(reply)") |
| XCTAssertNotNil(reply["activationId"]) |
| let id = reply["activationId"] as! String |
| print("Got id \(id)") |
| } |
| |
| expectation.fulfill() |
| |
| |
| }) |
| } catch { |
| print(error) |
| XCTFail("Error invoking action \(error)") |
| } |
| |
| waitForExpectations(withTimeout: Timeout, handler: { error in |
| |
| if let error = error { |
| print("Error: \(error)") |
| } |
| }) |
| |
| } else { |
| XCTFail("No credentials available to run test") |
| } |
| } |
| |
| func testWhiskTrigger() { |
| |
| if let apiKey = apiKey, apiSecret = apiSecret { |
| // setup for async testing |
| let expectation = self.expectation(withDescription: "Whisk Callback") |
| |
| // allow for self-signed certificates |
| let session = URLSession(configuration: URLSessionConfiguration.default, delegate: NetworkUtilsDelegate(), delegateQueue:OperationQueue.main) |
| |
| let credentials = WhiskCredentials(accessKey: apiKey, accessToken: apiSecret) |
| let whisk = Whisk(credentials: credentials) |
| whisk.urlSession = session |
| whisk.baseURL = "https://openwhisk.ng.bluemix.net" |
| |
| do { |
| |
| try whisk.fireTrigger(name: "myTrigger", callback: { (reply, error) in |
| |
| if let error = error { |
| if case let WhiskError.HTTPError(description, statusCode, "default") = error { |
| |
| print("Error: \(description) statusCode: \(statusCode))") |
| |
| // actually any of these status codes are probably OK since the API call succeeded |
| if statusCode != 401 && statusCode != 408 && statusCode != 500 { |
| XCTFail("Error: \(description) statusCode: \(statusCode))") |
| } |
| |
| } |
| } else if let reply = reply { |
| print("\(reply)") |
| } else { |
| print("No error or response") |
| } |
| }) |
| |
| expectation.fulfill() |
| |
| } catch { |
| print(error) |
| XCTFail("Error invoking trigger \(error)") |
| } |
| |
| waitForExpectations(withTimeout: Timeout, handler: { error in |
| |
| if let error = error { |
| print("Error: \(error)") |
| } |
| }) |
| |
| } else { |
| XCTFail("No credentials available to run test") |
| } |
| } |
| |
| } |