diff options
author | Mina Farid <minafarid@google.com> | 2018-06-04 14:36:55 -0400 |
---|---|---|
committer | Konstantin Varlamov <var-const@users.noreply.github.com> | 2018-06-04 14:36:55 -0400 |
commit | a135ee17175f8f186e73252263b8dbc3785f3d3c (patch) | |
tree | b76fdea7a5bfe27159c497e445a079cce005d1c0 /Firestore/Example/FuzzTests | |
parent | ce61f4e0e654e7a16dad023e1b8df32449d5a00f (diff) |
Add a new Xcode target and scheme for fuzz tests (#1364)
Created `Firestore_FuzzTests_iOS` Xcode target as a duplicate of the target
`Firestore_Tests_iOS`.
- Added `-fsanitize-coverage=trace-pc-guard` to the compiler flags to enable
code coverage by libFuzzer fuzzing driver.
- Modified the files to compile to the fuzz testing ones.
- Added a Principal testing class.
* Modified the `Podfile` to include `LibFuzzer.podspec` as a dependency for
the target `Firestore_FuzzTests_iOS`.
* Added a skeleton for fuzz testing. Currently does not test any code but
the fuzzing works fine and calls an empty `LLVMFuzzerTestOneInput`
with different input values.
- This means that fuzzing does not finish or crash.
Diffstat (limited to 'Firestore/Example/FuzzTests')
-rw-r--r-- | Firestore/Example/FuzzTests/FSTFuzzTestsPrincipal.mm | 64 | ||||
-rw-r--r-- | Firestore/Example/FuzzTests/Firestore_FuzzTests_iOS-Info.plist | 24 |
2 files changed, 88 insertions, 0 deletions
diff --git a/Firestore/Example/FuzzTests/FSTFuzzTestsPrincipal.mm b/Firestore/Example/FuzzTests/FSTFuzzTestsPrincipal.mm new file mode 100644 index 0000000..63f6db0 --- /dev/null +++ b/Firestore/Example/FuzzTests/FSTFuzzTestsPrincipal.mm @@ -0,0 +1,64 @@ +/* + * Copyright 2018 Google + * + * 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 <Foundation/NSObject.h> + +#include "LibFuzzer/FuzzerDefs.h" + +namespace { + +// Contains the code to be fuzzed. Called by the fuzzing library with +// different argument values for `data` and `size`. +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // Code to be fuzz-tested here. + return 0; +} + +// Simulates calling the main() function of libFuzzer (FuzzerMain.cpp). +int RunFuzzTestingMain() { + // Arguments to libFuzzer main() function should be added to this array, + // e.g., dictionaries, corpus, number of runs, jobs, etc. + char *program_args[] = { + const_cast<char *>("RunFuzzTestingMain") // First argument is program name. + }; + char **argv = program_args; + int argc = sizeof(program_args) / sizeof(program_args[0]); + + // Start fuzzing using libFuzzer's driver. + return fuzzer::FuzzerDriver(&argc, &argv, LLVMFuzzerTestOneInput); +} + +} // namespace + +/** + * This class is registered as the NSPrincipalClass in the + * Firestore_FuzzTests_iOS bundle's Info.plist. XCTest instantiates this class + * to perform one-time setup for the test bundle, as documented here: + * + * https://developer.apple.com/documentation/xctest/xctestobservationcenter + */ +@interface FSTFuzzTestsPrincipal : NSObject +@end + +@implementation FSTFuzzTestsPrincipal + +- (instancetype)init { + self = [super init]; + RunFuzzTestingMain(); + return self; +} + +@end diff --git a/Firestore/Example/FuzzTests/Firestore_FuzzTests_iOS-Info.plist b/Firestore/Example/FuzzTests/Firestore_FuzzTests_iOS-Info.plist new file mode 100644 index 0000000..0d53e5f --- /dev/null +++ b/Firestore/Example/FuzzTests/Firestore_FuzzTests_iOS-Info.plist @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>BNDL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>NSPrincipalClass</key> + <string>FSTFuzzTestsPrincipal</string> + <key>CFBundleVersion</key> + <string>1</string> +</dict> +</plist> |