FBElementCacheTests.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**
  2. * Copyright (c) 2015-present, Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. */
  9. #import <XCTest/XCTest.h>
  10. #import "FBElementCache.h"
  11. #import "XCUIElementDouble.h"
  12. #import "XCUIElement+FBCaching.h"
  13. #import "XCUIElement+FBUtilities.h"
  14. @interface FBElementCacheTests : XCTestCase
  15. @property (nonatomic, strong) FBElementCache *cache;
  16. @end
  17. @implementation FBElementCacheTests
  18. - (void)setUp
  19. {
  20. [super setUp];
  21. self.cache = [FBElementCache new];
  22. }
  23. - (void)testStoringElement
  24. {
  25. XCUIElementDouble *el1 = XCUIElementDouble.new;
  26. el1.wdUID = @"1";
  27. XCUIElementDouble *el2 = XCUIElementDouble.new;
  28. el2.wdUID = @"2";
  29. NSString *firstUUID = [self.cache storeElement:(XCUIElement *)el1];
  30. NSString *secondUUID = [self.cache storeElement:(XCUIElement *)el2];
  31. XCTAssertEqualObjects(firstUUID, el1.wdUID);
  32. XCTAssertEqualObjects(secondUUID, el2.wdUID);
  33. }
  34. - (void)testFetchingElement
  35. {
  36. XCUIElement *element = (XCUIElement *)XCUIElementDouble.new;
  37. NSString *uuid = [self.cache storeElement:element];
  38. XCTAssertNotNil(uuid, @"Stored index should be higher than 0");
  39. XCTAssertFalse(element.fb_isResolvedFromCache.boolValue);
  40. XCUIElement *cachedElement = [self.cache elementForUUID:uuid];
  41. XCTAssertEqual(element, cachedElement);
  42. XCTAssertTrue(element.fb_isResolvedFromCache.boolValue);
  43. }
  44. - (void)testFetchingBadIndex
  45. {
  46. XCTAssertThrows([self.cache elementForUUID:@"random"]);
  47. }
  48. - (void)testLinearCacheExpulsion
  49. {
  50. const int ELEMENT_COUNT = 1050;
  51. NSMutableArray *elements = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  52. NSMutableArray *elementIds = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  53. for(int i = 0; i < ELEMENT_COUNT; i++) {
  54. XCUIElementDouble *el = XCUIElementDouble.new;
  55. el.wdUID = [NSString stringWithFormat:@"%@", @(i)];
  56. [elements addObject:(XCUIElement *)el];
  57. }
  58. // The capacity of the cache is limited to 1024 elements. Add 1050
  59. // elements and make sure:
  60. // - The first 26 elements are no longer present in the cache
  61. // - The remaining 1024 elements are present in the cache
  62. for(int i = 0; i < ELEMENT_COUNT; i++) {
  63. [elementIds addObject:[self.cache storeElement:elements[i]]];
  64. }
  65. for(int i = 0; i < ELEMENT_COUNT - ELEMENT_CACHE_SIZE; i++) {
  66. XCTAssertThrows([self.cache elementForUUID:elementIds[i]]);
  67. }
  68. for(int i = ELEMENT_COUNT - ELEMENT_CACHE_SIZE; i < ELEMENT_COUNT; i++) {
  69. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  70. }
  71. }
  72. - (void)testMRUCacheExpulsion
  73. {
  74. const int ELEMENT_COUNT = 1050;
  75. const int ACCESSED_ELEMENT_COUNT = 24;
  76. NSMutableArray *elements = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  77. NSMutableArray *elementIds = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  78. for(int i = 0; i < ELEMENT_COUNT; i++) {
  79. XCUIElementDouble *el = XCUIElementDouble.new;
  80. el.wdUID = [NSString stringWithFormat:@"%@", @(i)];
  81. [elements addObject:(XCUIElement *)el];
  82. }
  83. // The capacity of the cache is limited to 1024 elements. Add 1050
  84. // elements, but with a twist: access the first 24 elements before
  85. // adding the last 50 elements. Then, make sure:
  86. // - The first 24 elements are present in the cache
  87. // - The next 26 elements are not present in the cache
  88. // - The remaining 1000 elements are present in the cache
  89. for(int i = 0; i < ELEMENT_CACHE_SIZE; i++) {
  90. [elementIds addObject:[self.cache storeElement:elements[i]]];
  91. }
  92. for(int i = 0; i < ACCESSED_ELEMENT_COUNT; i++) {
  93. [self.cache elementForUUID:elementIds[i]];
  94. }
  95. for(int i = ELEMENT_CACHE_SIZE; i < ELEMENT_COUNT; i++) {
  96. [elementIds addObject:[self.cache storeElement:elements[i]]];
  97. }
  98. for(int i = 0; i < ACCESSED_ELEMENT_COUNT; i++) {
  99. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  100. }
  101. for(int i = ACCESSED_ELEMENT_COUNT; i < ELEMENT_COUNT - ELEMENT_CACHE_SIZE + ACCESSED_ELEMENT_COUNT; i++) {
  102. XCTAssertThrows([self.cache elementForUUID:elementIds[i]]);
  103. }
  104. for(int i = ELEMENT_COUNT - ELEMENT_CACHE_SIZE + ACCESSED_ELEMENT_COUNT; i < ELEMENT_COUNT; i++) {
  105. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  106. }
  107. }
  108. @end