/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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/XCTest.h>
#import "WeexSDK.h"
#import "WXStorageModule.h"

@interface WXStorageTests : XCTestCase

@property (nonatomic, strong) WXStorageModule *storage;
@property (nonatomic, strong) dispatch_queue_t storageQueue;
@property (nonatomic, copy) NSString *directory;
@property (nonatomic, copy) NSString *filePath;
@property (nonatomic, copy) NSString *indexPath;
@property (nonatomic, copy) NSString *infoPath;
@property (nonatomic, copy) NSString *longValue;

@end

@implementation WXStorageTests

- (void)setUp {
    [super setUp];
    
    self.directory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    self.directory = [self.directory stringByAppendingPathComponent:@"wxstorage"];
    NSLog(@"---storage directory: %@",self.directory);
    self.filePath = [self.directory stringByAppendingPathComponent:@"wxstorage.plist"];
    self.infoPath = [self.directory stringByAppendingPathComponent:@"wxstorage.info.plist"];
    self.indexPath = [self.directory stringByAppendingPathComponent:@"wxstorage.index.plist"];
    
    // clear storage
    [[NSFileManager defaultManager] removeItemAtPath:self.filePath error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:self.infoPath error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:self.indexPath error:nil];
    
    self.storage = [WXStorageModule new];
    
    self.longValue = @"longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4longValue4";
    
    [self.storage setItem:@"initKey1" value:@"initValue1" callback:^(id result) {}];
    [self.storage setItem:@"initKey2" value:@"initValue2" callback:^(id result) {}];
    [self.storage setItem:@"initKey3" value:@"initValue3" callback:^(id result) {}];
    [self.storage setItemPersistent:@"initKey4" value:@"1234" callback:^(id result) {}];
    
    self.storageQueue = [self.storage targetExecuteQueue];
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testGetLength {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:self.filePath];
    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:self.infoPath];
    NSArray *indexArray = [NSArray arrayWithContentsOfFile:self.indexPath];
    
    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [weakSelf.storage length:^(id result) {
            [expectation fulfill];
            
            NSInteger count = [result[@"data"] integerValue];
            XCTAssert(dic.count == count);
            XCTAssert(infoDic.count == count);
            XCTAssert(indexArray.count == count);
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testGetAllKeys {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:self.filePath];
    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:self.infoPath];
    NSArray *indexArray = [NSArray arrayWithContentsOfFile:self.indexPath];
    
    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [weakSelf.storage getAllKeys:^(id result) {
            [expectation fulfill];

            NSArray *keys = result[@"data"];
            NSComparator block = ^NSComparisonResult(NSString *str1, NSString *str2) {
                return [str1 compare:str2];
            };
            keys = [keys sortedArrayUsingComparator:block];
            NSArray *dicKeys = [[dic allKeys] sortedArrayUsingComparator:block];
            NSArray *infoDicKeys = [[infoDic allKeys] sortedArrayUsingComparator:block];
            NSArray *indexKeys = [indexArray sortedArrayUsingComparator:block];
            XCTAssert((keys.count == 0 && [dic allKeys].count == 0) || [keys isEqualToArray:dicKeys]);
            XCTAssert((keys.count == 0 && [infoDic allKeys].count == 0) || [keys isEqualToArray:infoDicKeys]);
            XCTAssert((keys.count == 0 && indexArray.count == 0) || [keys isEqualToArray:indexKeys]);
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testSetItem {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [weakSelf.storage setItem:@"key1" value:@"shortValue1" callback:^(id ret) {
            [weakSelf.storage setItem:@"key1" value:@"shortValue12" callback:^(id result) {
                [expectation fulfill];

                NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.filePath];
                NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                NSArray *indexArray = [NSArray arrayWithContentsOfFile:weakSelf.indexPath];
                
                XCTAssert([@"success" isEqualToString:result[@"result"]]);
                XCTAssert([@"shortValue12" isEqualToString:dic[@"key1"]]);
                XCTAssertEqual(infoDic[@"key1"][@"persistent"], @(NO));
                XCTAssertEqual(infoDic[@"key1"][@"size"], @([@"shortValue12" length]));
                XCTAssertTrue([indexArray containsObject:@"key1"]);
            }];
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testSetItemPersistent {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [self.storage setItem:@"key2" value:@"shortValue2" callback:^(id result) {
            NSDictionary *infoDic1 = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
            __strong typeof(weakSelf) self = weakSelf;
            XCTAssertEqual(result[@"result"], @"success");
            XCTAssertEqual(infoDic1[@"key2"][@"persistent"], @(NO));
            
            [self.storage setItemPersistent:@"key2" value:@"shortValue22" callback:^(id result) {
                __strong typeof(weakSelf) self = weakSelf;
                NSDictionary *infoDic2 = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];

                XCTAssertEqual(result[@"result"], @"success");
                XCTAssertEqual(infoDic2[@"key2"][@"persistent"], @(YES));
                
                [self.storage setItem:@"key2" value:@"shortValue23" callback:^(id result) {
                    __strong typeof(weakSelf) self = weakSelf;
                    [expectation fulfill];

                    NSDictionary *infoDic3 = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                    
                    XCTAssertEqual(result[@"result"], @"success");
                    XCTAssertEqual(infoDic3[@"key2"][@"persistent"], @(NO));
                }];
            }];
        }];
    });
        
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testTimestamp {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [self.storage setItem:@"key3" value:@"shortValue3" callback:^(id result) {
            __strong typeof(weakSelf) self = weakSelf;
            NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
            NSTimeInterval tsNow = [[NSDate date] timeIntervalSince1970];
            NSTimeInterval ts = [infoDic[@"key3"][@"ts"] doubleValue];
            XCTAssertTrue(ABS(tsNow - ts) <= 1);

            [NSThread sleepForTimeInterval:2];
            
            [self.storage setItem:@"key3" value:@"shortValue32" callback:^(id result) {
                __strong typeof(weakSelf) self = weakSelf;
                NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                NSTimeInterval tsNow = [[NSDate date] timeIntervalSince1970];
                NSTimeInterval ts = [infoDic[@"key3"][@"ts"] doubleValue];
                XCTAssertTrue(ABS(tsNow - ts) <= 1);

                [NSThread sleepForTimeInterval:2];
                
                [self.storage getItem:@"key3" callback:^(id result) {
                    [expectation fulfill];

                    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                    NSTimeInterval tsNow = [[NSDate date] timeIntervalSince1970];
                    NSTimeInterval ts = [infoDic[@"key3"][@"ts"] doubleValue];
                    XCTAssertTrue(ABS(tsNow - ts) <= 1);
                    
                    [NSThread sleepForTimeInterval:2];
                }];
            }];
        }];
    });
    
    [self waitForExpectationsWithTimeout:20 handler:nil];
}

- (void)testSetItemLongValue {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    NSString *longValue = self.longValue;
    XCTAssertTrue(longValue.length > 1024);
    
    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [self.storage setItem:@"key4" value:longValue callback:^(id result) {
            __strong typeof(weakSelf) self = weakSelf;
            NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.filePath];
            NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
            NSArray *indexArray = [NSArray arrayWithContentsOfFile:weakSelf.indexPath];
            
            XCTAssertEqual(result[@"result"], @"success");
            XCTAssertNotEqual(dic[@"key4"], longValue);
            XCTAssertTrue([dic[@"key4"] isEqualToString:@"#{eulaVlluNegarotSXW}"]);
            XCTAssertFalse([infoDic[@"key4"][@"persistent"] boolValue]);
            XCTAssertTrue([infoDic[@"key4"][@"size"] integerValue] == [longValue length]);
            XCTAssertTrue([indexArray containsObject:@"key4"]);
            
            [self.storage getItem:@"key4" callback:^(id result) {
                [expectation fulfill];

                NSString *value = result[@"data"];
                XCTAssertEqual(value, longValue);
            }];
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testGetItem {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        [self.storage setItem:@"key5" value:@"shortValue5" callback:^(id result) {
            [weakSelf.storage getItem:@"key5" callback:^(id result) {
                __strong typeof(weakSelf) self = weakSelf;
                NSString *data = result[@"data"];
                
                XCTAssertEqual(result[@"result"], @"success");
                XCTAssertEqual(data, @"shortValue5");
                
                [weakSelf.storage setItem:@"key5" value:@"shortValue52" callback:^(id result) {
                    [weakSelf.storage getItem:@"key5" callback:^(id result) {
                        [expectation fulfill];
                        
                        NSString *data = result[@"data"];
                        
                        XCTAssertEqual(result[@"result"], @"success");
                        XCTAssertEqual(data, @"shortValue52");
                    }];
                }];
            }];
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testRemoveItem {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    __weak typeof(self) weakSelf = self;
    dispatch_async(self.storageQueue, ^{
        NSString *longValue = [@"longvalue6" stringByAppendingString:self.longValue];
        [self.storage setItem:@"key6" value:@"shortValue6" callback:^(id result) {
            [weakSelf.storage getItem:@"key6" callback:^(id result) {
                __strong typeof(weakSelf) self = weakSelf;
                NSString *value = result[@"data"];
                XCTAssertEqual(value, @"shortValue6");
                
                [weakSelf.storage removeItem:@"key6" callback:^(id result) {
                    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.filePath];
                    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                    NSArray *indexArray = [NSArray arrayWithContentsOfFile:weakSelf.indexPath];
                    
                    XCTAssertEqual(result[@"result"], @"success");
                    XCTAssertNil(dic[@"key6"]);
                    XCTAssertNil(infoDic[@"key6"]);
                    XCTAssertFalse([indexArray containsObject:@"key6"]);
                    
                    [weakSelf.storage setItem:@"key6" value:longValue callback:^(id result) {
                        [weakSelf.storage getItem:@"key6" callback:^(id result) {
                            NSString *value = result[@"data"];
                            XCTAssertEqual(value, longValue);
                            
                            [weakSelf.storage removeItem:@"key6" callback:^(id result) {
                                [expectation fulfill];

                                NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.filePath];
                                NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:weakSelf.infoPath];
                                NSArray *indexArray = [NSArray arrayWithContentsOfFile:weakSelf.indexPath];
                                
                                XCTAssertEqual(result[@"result"], @"success");
                                XCTAssertNil(dic[@"key6"]);
                                XCTAssertNil(infoDic[@"key6"]);
                                XCTAssertFalse([indexArray containsObject:@"key6"]);
                            }];
                        }];
                    }];
                }];
            }];
        }];
    });
    
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

- (void)testStorageLimit {
    XCTestExpectation *expectation = [self expectationWithDescription:@"storage"];

    dispatch_group_t storageGroup = dispatch_group_create();
    for (NSInteger i = 7; i < 1100; i++) {
        dispatch_group_enter(storageGroup);
        __weak typeof(self) weakSelf = self;
        dispatch_async(self.storageQueue, ^{
            NSString *key = [@"key" stringByAppendingString:[NSString stringWithFormat:@"%ld",i]];
            if (i % 3 == 0) {
                [weakSelf.storage setItemPersistent:key value:self.longValue callback:^(id result) {
                    XCTAssertEqual(result[@"result"], @"success");
                    dispatch_group_leave(storageGroup);
                }];
            } else {
                [weakSelf.storage setItem:key value:self.longValue callback:^(id result) {
                    XCTAssertEqual(result[@"result"], @"success");
                    dispatch_group_leave(storageGroup);
                }];
            }
        });
    }
    
    __weak typeof(self) welf = self;
    dispatch_group_notify(storageGroup, dispatch_get_main_queue(), ^{
        [expectation fulfill];
        
        NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:welf.filePath];
        NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:welf.infoPath];
        NSArray *indexArray = [NSArray arrayWithContentsOfFile:welf.indexPath];
        
        NSLog(@"---indexArray: %@", indexArray);
        
        XCTAssertEqual(dic.count, infoDic.count);
        XCTAssertEqual(indexArray.count, infoDic.count);
        XCTAssertNil(infoDic[@"key7"]);
        XCTAssertFalse([indexArray containsObject:@"key7"]);
        XCTAssertNotNil(infoDic[@"key9"]);
        XCTAssertTrue([indexArray containsObject:@"key9"]);
    });
    
    [self waitForExpectationsWithTimeout:300 handler:nil];
}

- (void)testGetItemold {
    NSLog(@"================ Set Item ======================");
    [self.storage setItem:@"key" value:@"value" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage setItem:@"key1" value:@"value1" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    [self.storage setItem:@"key2" value:@"value2" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage setItem:@"key3" value:@"value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3value3" callback:^(id result) {
        NSLog(@"== %@",result);
    }];
    NSLog(@"================ Get Item ======================");
    [self.storage getItem:@"key" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage getItem:@"key1" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage getItem:@"key2" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage getItem:@"key3" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage getAllKeys:^(id result) {
        NSLog(@"getAllKeys : %@",result);
    }];
    
    [self.storage removeItem:@"key3" callback:^(id result) {
        NSLog(@"%@",result);
    }];
    
    [self.storage getItem:@"key3" callback:^(id result) {
        NSLog(@"%@",result);
    }];
}

@end
