blob: 2a99e53f46328a9ecdf30886d0c81c25491ccd84 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/location.h"
#include "base/path_service.h"
#include "components/cronet/ios/test/cronet_test_base.h"
#include "components/cronet/ios/test/start_cronet.h"
#include "components/cronet/test/test_server.h"
#include "net/base/mac/url_conversions.h"
#include "net/test/quic_simple_test_server.h"
#include "testing/gtest_mac.h"
#include "url/gurl.h"
namespace cronet {
class PrefsTest : public CronetTestBase {
protected:
void SetUp() override {
CronetTestBase::SetUp();
TestServer::Start();
[Cronet setRequestFilterBlock:^(NSURLRequest* request) {
return YES;
}];
NSURLSessionConfiguration* config =
[NSURLSessionConfiguration ephemeralSessionConfiguration];
[Cronet installIntoSessionConfiguration:config];
session_ = [NSURLSession sessionWithConfiguration:config
delegate:delegate_
delegateQueue:nil];
}
void TearDown() override {
TestServer::Shutdown();
[Cronet stopNetLog];
[Cronet shutdownForTesting];
CronetTestBase::TearDown();
}
NSString* GetFileContentWaitUntilCreated(NSString* file,
NSTimeInterval timeout,
NSError** error) {
// Wait until the file appears on disk.
NSFileManager* file_manager = [NSFileManager defaultManager];
NSLog(@"Waiting for file %@.", file);
while (timeout > 0) {
if ([file_manager fileExistsAtPath:file]) {
NSLog(@"File %@ exists.", file);
break;
}
NSLog(@"Time left: %i seconds", (int)timeout);
NSTimeInterval sleep_interval = fmin(5.0, timeout);
[NSThread sleepForTimeInterval:sleep_interval];
timeout -= sleep_interval;
}
// Read the file on the file thread to avoid reading the changing file.
dispatch_semaphore_t lock = dispatch_semaphore_create(0);
__block NSString* file_content = nil;
__block NSError* block_error = nil;
PostBlockToFileThread(FROM_HERE, ^{
file_content = [NSString stringWithContentsOfFile:file
encoding:NSUTF8StringEncoding
error:&block_error];
dispatch_semaphore_signal(lock);
});
// Wait for the file thread to finish reading the file content.
dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
if (block_error) {
*error = block_error;
}
return file_content;
}
NSURLSession* session_;
};
TEST_F(PrefsTest, HttpServerProperties) {
base::FilePath storage_path;
bool result = base::PathService::Get(base::DIR_CACHE, &storage_path);
ASSERT_TRUE(result);
storage_path =
storage_path.Append(FILE_PATH_LITERAL("cronet/prefs/local_prefs.json"));
NSString* prefs_file_name =
[NSString stringWithCString:storage_path.AsUTF8Unsafe().c_str()
encoding:NSUTF8StringEncoding];
// Delete the prefs file if it exists.
[[NSFileManager defaultManager] removeItemAtPath:prefs_file_name error:nil];
// Add "max_server_configs_stored_in_properties" experimental option.
NSString* options =
@"{ \"QUIC\" : {\"max_server_configs_stored_in_properties\" : 5} }";
[Cronet setExperimentalOptions:options];
// Start Cronet Engine
StartCronet(net::QuicSimpleTestServer::GetPort());
// Start the request
NSURL* url = net::NSURLWithGURL(net::QuicSimpleTestServer::GetSimpleURL());
NSURLSessionDataTask* task = [session_ dataTaskWithURL:url];
StartDataTaskAndWaitForCompletion(task);
// Wait 80 seconds for the prefs file to appear on the disk.
NSError* error = nil;
NSString* prefs_file_content =
GetFileContentWaitUntilCreated(prefs_file_name, 80, &error);
ASSERT_FALSE(error) << "Unable to read " << storage_path << " file. Error: "
<< error.localizedDescription.UTF8String;
// Check the file content
ASSERT_TRUE(prefs_file_content);
ASSERT_TRUE(
[prefs_file_content containsString:@"{\"http_server_properties\":"])
<< "Unable to find 'http_server_properties' in the JSON prefs.";
ASSERT_TRUE([prefs_file_content containsString:@"\"supports_quic\":"])
<< "Unable to find 'supports_quic' in the JSON prefs.";
ASSERT_TRUE([prefs_file_content containsString:@"\"server_info\":"])
<< "Unable to find 'server_info' in the JSON prefs.";
// Delete the prefs file to avoid side effects with other tests.
[[NSFileManager defaultManager] removeItemAtPath:prefs_file_name error:nil];
}
} // namespace cronet