Loading...
testing/builder-unit-tests/CacheLayoutTests.mm /dev/null dyld-1066.8
--- /dev/null
+++ dyld/dyld-1066.8/testing/builder-unit-tests/CacheLayoutTests.mm
@@ -0,0 +1,293 @@
+
+/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
+ *
+ * Copyright (c) 2021 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <XCTest/XCTest.h>
+
+#include "NewSharedCacheBuilder.h"
+#include "BuilderFileSystem.h"
+
+using namespace cache_builder;
+
+@interface CacheLayoutTests : XCTestCase
+
+@end
+
+@implementation CacheLayoutTests
+{
+    // Everyone shares a default file system
+    const FileSystemMRM fileSystem;
+
+    // Parameters to Options
+    //std::string_view archName;
+    //dyld3::Platform platform;
+    bool        dylibsRemovedFromDisk;
+    bool        isLocallyBuiltCache;
+    CacheKind   cacheKind;
+    bool        forceDevelopmentSubCacheSuffix;
+}
+
+- (void)setUp {
+    // Put setup code here. This method is called before the invocation of each test method in the class.
+
+    // Reset default options
+    dylibsRemovedFromDisk           = true;
+    isLocallyBuiltCache             = true;
+    cacheKind                       = CacheKind::development;
+    forceDevelopmentSubCacheSuffix  = false;
+}
+
+- (void)tearDown {
+    // Put teardown code here. This method is called after the invocation of each test method in the class.
+}
+
+// macOS caches should have no .development or other suffixes, just the number
+- (void)testSubCacheNames_macOS {
+    // Arrange: mock up builder and subcaches
+    cache_builder::BuilderOptions options("x86_64", dyld3::Platform::macOS,
+                                          dylibsRemovedFromDisk, isLocallyBuiltCache, cacheKind,
+                                          forceDevelopmentSubCacheSuffix);
+    SharedCacheBuilder builder(options, fileSystem);
+
+    // Add a main subCache
+    builder.subCaches.reserve(3);
+    SubCache& mainSubCache = builder.subCaches.emplace_back(SubCache::makeMainCache(options, true));
+    SubCache& subCache1 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& subCache2 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    mainSubCache.subCaches.push_back(&subCache1);
+    mainSubCache.subCaches.push_back(&subCache2);
+
+    // Act:
+    builder.setSubCacheNames();
+
+    // Assert:
+    XCTAssertTrue(mainSubCache.fileSuffix == "");
+    XCTAssertTrue(subCache1.fileSuffix == ".01");
+    XCTAssertTrue(subCache2.fileSuffix == ".02");
+}
+
+// Simulator caches should have no .development or other suffixes, just the number
+- (void)testSubCacheNames_iOS_Simulator {
+    // Arrange: mock up builder and subcaches
+    cache_builder::BuilderOptions options("arm64", dyld3::Platform::iOS_simulator,
+                                          dylibsRemovedFromDisk, isLocallyBuiltCache, cacheKind,
+                                          forceDevelopmentSubCacheSuffix);
+    SharedCacheBuilder builder(options, fileSystem);
+
+    // Add a main subCache
+    builder.subCaches.reserve(3);
+    SubCache& mainSubCache = builder.subCaches.emplace_back(SubCache::makeMainCache(options, true));
+    SubCache& subCache1 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& subCache2 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    mainSubCache.subCaches.push_back(&subCache1);
+    mainSubCache.subCaches.push_back(&subCache2);
+
+    // Act:
+    builder.setSubCacheNames();
+
+    // Assert:
+    XCTAssertTrue(mainSubCache.fileSuffix == "");
+    XCTAssertTrue(subCache1.fileSuffix == ".01");
+    XCTAssertTrue(subCache2.fileSuffix == ".02");
+}
+
+// iOS development main caches should end in .developent
+// iOS sub caches shouldn't have an extension
+- (void)testSubCacheNames_iOS_development {
+    // Arrange: mock up builder and subcaches
+    cacheKind = CacheKind::universal;
+    cache_builder::BuilderOptions options("arm64", dyld3::Platform::iOS,
+                                          dylibsRemovedFromDisk, isLocallyBuiltCache, cacheKind,
+                                          forceDevelopmentSubCacheSuffix);
+    SharedCacheBuilder builder(options, fileSystem);
+
+    // Add a main subCache
+    builder.subCaches.reserve(3);
+    SubCache& mainSubCache = builder.subCaches.emplace_back(SubCache::makeMainCache(options, true));
+    SubCache& subCache1 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& subCache2 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    mainSubCache.subCaches.push_back(&subCache1);
+    mainSubCache.subCaches.push_back(&subCache2);
+
+    // Act:
+    builder.setSubCacheNames();
+
+    // Assert:
+    XCTAssertTrue(mainSubCache.fileSuffix == ".development");
+    XCTAssertTrue(subCache1.fileSuffix == ".01");
+    XCTAssertTrue(subCache2.fileSuffix == ".02");
+}
+
+// iOS customer main caches should have no extension
+// iOS sub caches shouldn't have an extension
+- (void)testSubCacheNames_iOS_customer {
+    // Arrange: mock up builder and subcaches
+    cacheKind = CacheKind::universal;
+    cache_builder::BuilderOptions options("arm64", dyld3::Platform::iOS,
+                                          dylibsRemovedFromDisk, isLocallyBuiltCache, cacheKind,
+                                          forceDevelopmentSubCacheSuffix);
+    SharedCacheBuilder builder(options, fileSystem);
+
+    // Add a main subCache
+    builder.subCaches.reserve(3);
+    SubCache& mainSubCache = builder.subCaches.emplace_back(SubCache::makeMainCache(options, false));
+    SubCache& subCache1 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& subCache2 = builder.subCaches.emplace_back(SubCache::makeSubCache(options));
+    mainSubCache.subCaches.push_back(&subCache1);
+    mainSubCache.subCaches.push_back(&subCache2);
+
+    // Act:
+    builder.setSubCacheNames();
+
+    // Assert:
+    XCTAssertTrue(mainSubCache.fileSuffix == "");
+    XCTAssertTrue(subCache1.fileSuffix == ".01");
+    XCTAssertTrue(subCache2.fileSuffix == ".02");
+}
+
+// This combines all of the above names
+// main caches should have either .development or no extension
+// sub caches should either no extension, .dylddata, or .dyldlinkedit
+// stub caches should have no extension or .development
+// symbols files should end in .symbols
+- (void)testSubCacheNames_iOS_universal {
+    // Arrange: mock up builder and subcaches
+    cacheKind = CacheKind::universal;
+    cache_builder::BuilderOptions options("arm64", dyld3::Platform::iOS,
+                                          dylibsRemovedFromDisk, isLocallyBuiltCache, cacheKind,
+                                          forceDevelopmentSubCacheSuffix);
+    SharedCacheBuilder builder(options, fileSystem);
+    auto& subCaches = builder.subCaches;
+
+    // Add the following:
+    // main dev cache
+    // main customer cache
+    // text subcache
+    // stubs dev cache
+    // stubs customer cache
+    // text subcache
+    // stubs dev cache
+    // stubs customer cache
+    // data sub cache
+    // linkedit sub cache
+    // text subcache
+    // stubs dev cache
+    // stubs customer cache
+    // text subcache
+    // stubs dev cache
+    // stubs customer cache
+    // data sub cache
+    // linkedit sub cache
+    subCaches.reserve(20);
+    SubCache& mainDevCache = subCaches.emplace_back(SubCache::makeMainCache(options, true));
+    SubCache& mainCustCache = subCaches.emplace_back(SubCache::makeMainCache(options, false));
+    SubCache& textCache1 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& stubsDevCache2 = subCaches.emplace_back(SubCache::makeStubsCache(options, true));
+    SubCache& stubsCustCache2 = subCaches.emplace_back(SubCache::makeStubsCache(options, false));
+    SubCache& textCache3 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& stubsDevCache4 = subCaches.emplace_back(SubCache::makeStubsCache(options, true));
+    SubCache& stubsCustCache4 = subCaches.emplace_back(SubCache::makeStubsCache(options, false));
+    SubCache& dataCache5 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& linkeditCache6 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& textCache7 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& stubsDevCache8 = subCaches.emplace_back(SubCache::makeStubsCache(options, true));
+    SubCache& stubsCustCache8 = subCaches.emplace_back(SubCache::makeStubsCache(options, false));
+    SubCache& textCache9 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& stubsDevCache10 = subCaches.emplace_back(SubCache::makeStubsCache(options, true));
+    SubCache& stubsCustCache10 = subCaches.emplace_back(SubCache::makeStubsCache(options, false));
+    SubCache& dataCache11 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& linkeditCache12 = subCaches.emplace_back(SubCache::makeSubCache(options));
+    SubCache& symbolsCache = subCaches.emplace_back(SubCache::makeSymbolsCache());
+
+    // Add some data/linkedit to the required subcaches
+    ObjCStringsChunk dataChunk1;
+    ObjCStringsChunk linkeditChunk1;
+    ObjCStringsChunk dataChunk2;
+    ObjCStringsChunk dataConstChunk2;
+    ObjCStringsChunk authChunk2;
+    ObjCStringsChunk authConstChunk2;
+    ObjCStringsChunk linkeditChunk2;
+    dataCache5.addDataChunk(&dataChunk1);
+    linkeditCache6.addLinkeditChunk(&linkeditChunk1);
+    dataCache11.addDataChunk(&dataChunk2);
+    dataCache11.addDataConstChunk(&dataConstChunk2);
+    dataCache11.addAuthChunk(&authChunk2);
+    dataCache11.addAuthConstChunk(&authConstChunk2);
+    linkeditCache12.addLinkeditChunk(&linkeditChunk2);
+
+    // Track all subCaches on the main caches
+    // Development
+    mainDevCache.subCaches.push_back(&textCache1);
+    mainDevCache.subCaches.push_back(&stubsDevCache2);
+    mainDevCache.subCaches.push_back(&textCache3);
+    mainDevCache.subCaches.push_back(&stubsDevCache4);
+    mainDevCache.subCaches.push_back(&dataCache5);
+    mainDevCache.subCaches.push_back(&linkeditCache6);
+    mainDevCache.subCaches.push_back(&textCache7);
+    mainDevCache.subCaches.push_back(&stubsDevCache8);
+    mainDevCache.subCaches.push_back(&textCache9);
+    mainDevCache.subCaches.push_back(&stubsDevCache10);
+    mainDevCache.subCaches.push_back(&dataCache11);
+    mainDevCache.subCaches.push_back(&linkeditCache12);
+
+    // Customer
+    mainCustCache.subCaches.push_back(&textCache1);
+    mainCustCache.subCaches.push_back(&stubsCustCache2);
+    mainCustCache.subCaches.push_back(&textCache3);
+    mainCustCache.subCaches.push_back(&stubsCustCache4);
+    mainCustCache.subCaches.push_back(&dataCache5);
+    mainCustCache.subCaches.push_back(&linkeditCache6);
+    mainCustCache.subCaches.push_back(&textCache7);
+    mainCustCache.subCaches.push_back(&stubsCustCache8);
+    mainCustCache.subCaches.push_back(&textCache9);
+    mainCustCache.subCaches.push_back(&stubsCustCache10);
+    mainCustCache.subCaches.push_back(&dataCache11);
+    mainCustCache.subCaches.push_back(&linkeditCache12);
+
+    // Act:
+    builder.setSubCacheNames();
+
+    // Assert:
+    XCTAssertTrue(mainDevCache.fileSuffix        == ".development");
+    XCTAssertTrue(mainCustCache.fileSuffix       == "");
+    XCTAssertTrue(textCache1.fileSuffix          == ".01");
+    XCTAssertTrue(stubsDevCache2.fileSuffix      == ".02.development");
+    XCTAssertTrue(stubsCustCache2.fileSuffix     == ".02");
+    XCTAssertTrue(textCache3.fileSuffix          == ".03");
+    XCTAssertTrue(stubsDevCache4.fileSuffix      == ".04.development");
+    XCTAssertTrue(stubsCustCache4.fileSuffix     == ".04");
+    XCTAssertTrue(dataCache5.fileSuffix          == ".05.dylddata");
+    XCTAssertTrue(linkeditCache6.fileSuffix      == ".06.dyldlinkedit");
+    XCTAssertTrue(textCache7.fileSuffix          == ".07");
+    XCTAssertTrue(stubsDevCache8.fileSuffix      == ".08.development");
+    XCTAssertTrue(stubsCustCache8.fileSuffix     == ".08");
+    XCTAssertTrue(textCache9.fileSuffix          == ".09");
+    XCTAssertTrue(stubsDevCache10.fileSuffix     == ".10.development");
+    XCTAssertTrue(stubsCustCache10.fileSuffix    == ".10");
+    XCTAssertTrue(dataCache11.fileSuffix         == ".11.dylddata");
+    XCTAssertTrue(linkeditCache12.fileSuffix     == ".12.dyldlinkedit");
+    XCTAssertTrue(symbolsCache.fileSuffix        == ".symbols");
+}
+
+@end