blob: e0115203c5f4aa141121078231b336d373ea6ae2 [file] [log] [blame]
// Copyright 2013 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.
#import "components/translate/ios/browser/js_translate_manager.h"
#import "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h"
#include "base/time/time.h"
#include "grit/components_resources.h"
#import "ios/web/public/test/crw_test_js_injection_receiver.h"
#import "ios/web/public/test/js_test_util.h"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
#include "ui/base/resource/resource_bundle.h"
using base::Time;
using base::TimeDelta;
@interface JsTranslateManager (Testing)
- (double)performanceNow;
@end
@implementation JsTranslateManager (Testing)
// Returns the time in milliseconds.
- (double)performanceNow {
NSString* result =
web::EvaluateJavaScriptAsString(self.receiver, @"performance.now()");
return [result doubleValue];
}
@end
class JsTranslateManagerTest : public PlatformTest {
protected:
JsTranslateManagerTest() {
receiver_.reset([[CRWTestJSInjectionReceiver alloc] init]);
manager_.reset([[JsTranslateManager alloc] initWithReceiver:receiver_]);
base::StringPiece script =
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_TRANSLATE_JS);
[manager_ setScript:base::SysUTF8ToNSString(script.as_string() +
"('DummyKey');")];
}
bool IsDefined(NSString* name) {
NSString* script =
[NSString stringWithFormat:@"typeof %@ != 'undefined'", name];
return [web::EvaluateJavaScriptAsString(receiver_, script) isEqual:@"true"];
}
base::scoped_nsobject<CRWTestJSInjectionReceiver> receiver_;
base::scoped_nsobject<JsTranslateManager> manager_;
};
TEST_F(JsTranslateManagerTest, PerformancePlaceholder) {
[manager_ inject];
EXPECT_TRUE(IsDefined(@"performance"));
EXPECT_TRUE(IsDefined(@"performance.now"));
// Check that performance.now returns correct values.
NSTimeInterval intervalInSeconds = 0.3;
double startTime = [manager_ performanceNow];
[NSThread sleepForTimeInterval:intervalInSeconds];
double endTime = [manager_ performanceNow];
double timeElapsed = endTime - startTime;
// The tolerance is high to avoid flake.
EXPECT_NEAR(timeElapsed, intervalInSeconds * 1000, 100);
}
TEST_F(JsTranslateManagerTest, Inject) {
[manager_ inject];
EXPECT_TRUE([manager_ hasBeenInjected]);
EXPECT_EQ(nil, [manager_ script]);
// TODO(shreyasv): Switch to the util function in web/ once that CL lands.
__block BOOL block_was_called = NO;
[manager_ evaluate:@"cr.googleTranslate.libReady"
stringResultHandler:^(NSString* result, NSError*) {
block_was_called = YES;
EXPECT_NSEQ(@"false", result);
}];
// TODO(shreyasv): Move to |WaitUntilCondition| once that is moved to ios/.
const NSTimeInterval kTimeout = 5.0;
Time startTime = Time::Now();
while (!block_was_called &&
(Time::Now() - startTime < TimeDelta::FromSeconds(kTimeout))) {
NSDate* beforeDate = [NSDate dateWithTimeIntervalSinceNow:.01];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:beforeDate];
}
EXPECT_TRUE(block_was_called);
}