FBElementCacheTests.m 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. XCUIElement *cachedElement = [self.cache elementForUUID:uuid];
  40. XCTAssertEqual(element, cachedElement);
  41. }
  42. - (void)testFetchingBadIndex
  43. {
  44. XCTAssertThrows([self.cache elementForUUID:@"random"]);
  45. }
  46. - (void)testLinearCacheExpulsion
  47. {
  48. const int ELEMENT_COUNT = 1050;
  49. NSMutableArray *elements = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  50. NSMutableArray *elementIds = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  51. for(int i = 0; i < ELEMENT_COUNT; i++) {
  52. XCUIElementDouble *el = XCUIElementDouble.new;
  53. el.wdUID = [NSString stringWithFormat:@"%@", @(i)];
  54. [elements addObject:(XCUIElement *)el];
  55. }
  56. // The capacity of the cache is limited to 1024 elements. Add 1050
  57. // elements and make sure:
  58. // - The first 26 elements are no longer present in the cache
  59. // - The remaining 1024 elements are present in the cache
  60. for(int i = 0; i < ELEMENT_COUNT; i++) {
  61. [elementIds addObject:[self.cache storeElement:elements[i]]];
  62. }
  63. for(int i = 0; i < ELEMENT_COUNT - ELEMENT_CACHE_SIZE; i++) {
  64. XCTAssertThrows([self.cache elementForUUID:elementIds[i]]);
  65. }
  66. for(int i = ELEMENT_COUNT - ELEMENT_CACHE_SIZE; i < ELEMENT_COUNT; i++) {
  67. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  68. }
  69. }
  70. - (void)testMRUCacheExpulsion
  71. {
  72. const int ELEMENT_COUNT = 1050;
  73. const int ACCESSED_ELEMENT_COUNT = 24;
  74. NSMutableArray *elements = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  75. NSMutableArray *elementIds = [NSMutableArray arrayWithCapacity:ELEMENT_COUNT];
  76. for(int i = 0; i < ELEMENT_COUNT; i++) {
  77. XCUIElementDouble *el = XCUIElementDouble.new;
  78. el.wdUID = [NSString stringWithFormat:@"%@", @(i)];
  79. [elements addObject:(XCUIElement *)el];
  80. }
  81. // The capacity of the cache is limited to 1024 elements. Add 1050
  82. // elements, but with a twist: access the first 24 elements before
  83. // adding the last 50 elements. Then, make sure:
  84. // - The first 24 elements are present in the cache
  85. // - The next 26 elements are not present in the cache
  86. // - The remaining 1000 elements are present in the cache
  87. for(int i = 0; i < ELEMENT_CACHE_SIZE; i++) {
  88. [elementIds addObject:[self.cache storeElement:elements[i]]];
  89. }
  90. for(int i = 0; i < ACCESSED_ELEMENT_COUNT; i++) {
  91. [self.cache elementForUUID:elementIds[i]];
  92. }
  93. for(int i = ELEMENT_CACHE_SIZE; i < ELEMENT_COUNT; i++) {
  94. [elementIds addObject:[self.cache storeElement:elements[i]]];
  95. }
  96. for(int i = 0; i < ACCESSED_ELEMENT_COUNT; i++) {
  97. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  98. }
  99. for(int i = ACCESSED_ELEMENT_COUNT; i < ELEMENT_COUNT - ELEMENT_CACHE_SIZE + ACCESSED_ELEMENT_COUNT; i++) {
  100. XCTAssertThrows([self.cache elementForUUID:elementIds[i]]);
  101. }
  102. for(int i = ELEMENT_COUNT - ELEMENT_CACHE_SIZE + ACCESSED_ELEMENT_COUNT; i < ELEMENT_COUNT; i++) {
  103. XCTAssertEqual(elements[i], [self.cache elementForUUID:elementIds[i]]);
  104. }
  105. }
  106. @end