Showing content from https://cloud.google.com/cpp/docs/reference/spanner/2.40.0/spanner-mocking below:
C++ Client Libraries | Google Cloud
Skip to main content
- Overview
-
Library reference docs
- Cloud Spanner C++ Client Library
-
Namespaces
-
google::cloud::spanner
- Overview
-
Classes
-
Structs
-
ExcludeTransactionFromChangeStreamsOption
-
QueryOptimizerStatisticsPackageOption
-
SessionPoolActionOnExhaustionOption
-
SessionPoolKeepAliveIntervalOption
-
SessionPoolMaxIdleSessionsOption
-
SessionPoolMaxSessionsPerChannelOption
-
StreamingResumabilityBufferSizeOption
-
Functions
- ToInteger(Decimal< Mode > const &, int)
- MakeNumeric(std::string)
- MakeNumeric(double)
- MakeNumeric(T, int)
- MakePgNumeric(std::string)
- MakePgNumeric(double)
- MakePgNumeric(T, int)
- MakeBackup(std::string const &)
- MakeConnection(spanner::Database const &, Options)
- MakeConnection(Database const &, ConnectionOptions const &, SessionPoolOptions)
- MakeConnection(Database const &, ConnectionOptions const &, SessionPoolOptions, std::unique_ptr< RetryPolicy >, std::unique_ptr< BackoffPolicy >)
- MakeDatabase(std::string const &)
- MakeDatabaseAdminConnection(Options)
- MakeDatabaseAdminConnection(ConnectionOptions const &)
- MakeDatabaseAdminConnection(ConnectionOptions const &, std::unique_ptr< RetryPolicy >, std::unique_ptr< BackoffPolicy >, std::unique_ptr< PollingPolicy >)
- MakeInstance(std::string const &)
- MakeInstanceAdminConnection(Options)
- MakeInstanceAdminConnection(ConnectionOptions const &)
- MakeInstanceAdminConnection(ConnectionOptions const &, std::unique_ptr< RetryPolicy >, std::unique_ptr< BackoffPolicy >, std::unique_ptr< PollingPolicy >)
- MakeInterval(absl::string_view)
- JustifyDays(Interval)
- JustifyHours(Interval)
- JustifyInterval(Interval)
- MakeKey(Ts &&...)
- MakeKeyBoundClosed(Ts &&...)
- MakeKeyBoundOpen(Ts &&...)
- MakeInsertMutation(std::string, std::vector< std::string >, Ts &&...)
- MakeUpdateMutation(std::string, std::vector< std::string >, Ts &&...)
- MakeInsertOrUpdateMutation(std::string, std::vector< std::string >, Ts &&...)
- MakeReplaceMutation(std::string, std::vector< std::string >, Ts &&...)
- MakeDeleteMutation(std::string, KeySet)
- MakeDecimal(std::string)
- MakeDecimal(double)
- MakeDecimal(T, int)
- ToDouble(Decimal< Mode > const &)
- ToOptions(PartitionOptions const &)
- ToPartitionOptions(Options const &)
- SerializeQueryPartition(QueryPartition const &)
- DeserializeQueryPartition(std::string const &)
- ToOptions(ReadOptions const &)
- ToReadOptions(Options const &)
- SerializeReadPartition(ReadPartition const &)
- DeserializeReadPartition(std::string const &)
- MakeTestRow(std::vector< std::pair< std::string, Value > >)
- MakeTestRow(Ts &&...)
- StreamOf(RowRange &&)
- GetSingularRow(RowRange)
- MakeTimestamp(absl::Time)
- MakeTimestamp(protobuf::Timestamp const &)
- MakeTimestamp(sys_time< Duration > const &)
- MakeReadOnlyTransaction(Transaction::ReadOnlyOptions)
- MakeReadWriteTransaction(Transaction::ReadWriteOptions)
- MakeReadWriteTransaction(Transaction const &, Transaction::ReadWriteOptions)
- MakeUuid(absl::string_view)
- MakeNullValue()
- VersionMajor()
- VersionMinor()
- VersionPatch()
- VersionPreRelease()
- Version()
- VersionString()
-
Operators
- operator==(Json const &, Json const &)
- operator!=(Json const &, Json const &)
- operator==(JsonB const &, JsonB const &)
- operator!=(JsonB const &, JsonB const &)
- operator==(ReplicaSelection const &, ReplicaSelection const &)
- operator!=(ReplicaSelection const &, ReplicaSelection const &)
- operator<<(std::ostream &, Json const &)
- operator<<(std::ostream &, JsonB const &)
- operator<<(std::ostream &, PgOid const &)
- operator==(PartitionOptions const &, PartitionOptions const &)
- operator!=(PartitionOptions const &, PartitionOptions const &)
- operator==(ReadOptions const &, ReadOptions const &)
- operator!=(ReadOptions const &, ReadOptions const &)
-
google::cloud::spanner_admin
- Overview
-
Classes
-
DatabaseAdminClient
- Overview
-
Functions
- ListDatabases(std::string const &, Options)
- ListDatabases(google::spanner::admin::database::v1::ListDatabasesRequest, Options)
- CreateDatabase(std::string const &, std::string const &, Options)
- CreateDatabase(NoAwaitTag, std::string const &, std::string const &, Options)
- CreateDatabase(google::spanner::admin::database::v1::CreateDatabaseRequest const &, Options)
- CreateDatabase(NoAwaitTag, google::spanner::admin::database::v1::CreateDatabaseRequest const &, Options)
- CreateDatabase(google::longrunning::Operation const &, Options)
- GetDatabase(std::string const &, Options)
- GetDatabase(google::spanner::admin::database::v1::GetDatabaseRequest const &, Options)
- UpdateDatabase(google::spanner::admin::database::v1::Database const &, google::protobuf::FieldMask const &, Options)
- UpdateDatabase(NoAwaitTag, google::spanner::admin::database::v1::Database const &, google::protobuf::FieldMask const &, Options)
- UpdateDatabase(google::spanner::admin::database::v1::UpdateDatabaseRequest const &, Options)
- UpdateDatabase(NoAwaitTag, google::spanner::admin::database::v1::UpdateDatabaseRequest const &, Options)
- UpdateDatabase(google::longrunning::Operation const &, Options)
- UpdateDatabaseDdl(std::string const &, std::vector< std::string > const &, Options)
- UpdateDatabaseDdl(NoAwaitTag, std::string const &, std::vector< std::string > const &, Options)
- UpdateDatabaseDdl(google::spanner::admin::database::v1::UpdateDatabaseDdlRequest const &, Options)
- UpdateDatabaseDdl(NoAwaitTag, google::spanner::admin::database::v1::UpdateDatabaseDdlRequest const &, Options)
- UpdateDatabaseDdl(google::longrunning::Operation const &, Options)
- DropDatabase(std::string const &, Options)
- DropDatabase(google::spanner::admin::database::v1::DropDatabaseRequest const &, Options)
- GetDatabaseDdl(std::string const &, Options)
- GetDatabaseDdl(google::spanner::admin::database::v1::GetDatabaseDdlRequest const &, Options)
- SetIamPolicy(std::string const &, google::iam::v1::Policy const &, Options)
- SetIamPolicy(std::string const &, IamUpdater const &, Options)
- SetIamPolicy(google::iam::v1::SetIamPolicyRequest const &, Options)
- GetIamPolicy(std::string const &, Options)
- GetIamPolicy(google::iam::v1::GetIamPolicyRequest const &, Options)
- TestIamPermissions(std::string const &, std::vector< std::string > const &, Options)
- TestIamPermissions(google::iam::v1::TestIamPermissionsRequest const &, Options)
- CreateBackup(std::string const &, google::spanner::admin::database::v1::Backup const &, std::string const &, Options)
- CreateBackup(NoAwaitTag, std::string const &, google::spanner::admin::database::v1::Backup const &, std::string const &, Options)
- CreateBackup(google::spanner::admin::database::v1::CreateBackupRequest const &, Options)
- CreateBackup(NoAwaitTag, google::spanner::admin::database::v1::CreateBackupRequest const &, Options)
- CreateBackup(google::longrunning::Operation const &, Options)
- CopyBackup(std::string const &, std::string const &, std::string const &, google::protobuf::Timestamp const &, Options)
- CopyBackup(NoAwaitTag, std::string const &, std::string const &, std::string const &, google::protobuf::Timestamp const &, Options)
- CopyBackup(google::spanner::admin::database::v1::CopyBackupRequest const &, Options)
- CopyBackup(NoAwaitTag, google::spanner::admin::database::v1::CopyBackupRequest const &, Options)
- CopyBackup(google::longrunning::Operation const &, Options)
- GetBackup(std::string const &, Options)
- GetBackup(google::spanner::admin::database::v1::GetBackupRequest const &, Options)
- UpdateBackup(google::spanner::admin::database::v1::Backup const &, google::protobuf::FieldMask const &, Options)
- UpdateBackup(google::spanner::admin::database::v1::UpdateBackupRequest const &, Options)
- DeleteBackup(std::string const &, Options)
- DeleteBackup(google::spanner::admin::database::v1::DeleteBackupRequest const &, Options)
- ListBackups(std::string const &, Options)
- ListBackups(google::spanner::admin::database::v1::ListBackupsRequest, Options)
- RestoreDatabase(std::string const &, std::string const &, std::string const &, Options)
- RestoreDatabase(NoAwaitTag, std::string const &, std::string const &, std::string const &, Options)
- RestoreDatabase(google::spanner::admin::database::v1::RestoreDatabaseRequest const &, Options)
- RestoreDatabase(NoAwaitTag, google::spanner::admin::database::v1::RestoreDatabaseRequest const &, Options)
- RestoreDatabase(google::longrunning::Operation const &, Options)
- ListDatabaseOperations(std::string const &, Options)
- ListDatabaseOperations(google::spanner::admin::database::v1::ListDatabaseOperationsRequest, Options)
- ListBackupOperations(std::string const &, Options)
- ListBackupOperations(google::spanner::admin::database::v1::ListBackupOperationsRequest, Options)
- ListDatabaseRoles(std::string const &, Options)
- ListDatabaseRoles(google::spanner::admin::database::v1::ListDatabaseRolesRequest, Options)
- AddSplitPoints(std::string const &, std::vector< google::spanner::admin::database::v1::SplitPoints > const &, Options)
- AddSplitPoints(google::spanner::admin::database::v1::AddSplitPointsRequest const &, Options)
- CreateBackupSchedule(std::string const &, google::spanner::admin::database::v1::BackupSchedule const &, std::string const &, Options)
- CreateBackupSchedule(google::spanner::admin::database::v1::CreateBackupScheduleRequest const &, Options)
- GetBackupSchedule(std::string const &, Options)
- GetBackupSchedule(google::spanner::admin::database::v1::GetBackupScheduleRequest const &, Options)
- UpdateBackupSchedule(google::spanner::admin::database::v1::BackupSchedule const &, google::protobuf::FieldMask const &, Options)
- UpdateBackupSchedule(google::spanner::admin::database::v1::UpdateBackupScheduleRequest const &, Options)
- DeleteBackupSchedule(std::string const &, Options)
- DeleteBackupSchedule(google::spanner::admin::database::v1::DeleteBackupScheduleRequest const &, Options)
- ListBackupSchedules(std::string const &, Options)
- ListBackupSchedules(google::spanner::admin::database::v1::ListBackupSchedulesRequest, Options)
- ListOperations(std::string const &, std::string const &, Options)
- ListOperations(google::longrunning::ListOperationsRequest, Options)
- GetOperation(std::string const &, Options)
- GetOperation(google::longrunning::GetOperationRequest const &, Options)
- DeleteOperation(std::string const &, Options)
- DeleteOperation(google::longrunning::DeleteOperationRequest const &, Options)
- CancelOperation(std::string const &, Options)
- CancelOperation(google::longrunning::CancelOperationRequest const &, Options)
-
DatabaseAdminConnectionIdempotencyPolicy
-
DatabaseAdminLimitedErrorCountRetryPolicy
-
DatabaseAdminLimitedTimeRetryPolicy
-
InstanceAdminClient
- Overview
-
Functions
- ListInstanceConfigs(std::string const &, Options)
- ListInstanceConfigs(google::spanner::admin::instance::v1::ListInstanceConfigsRequest, Options)
- GetInstanceConfig(std::string const &, Options)
- GetInstanceConfig(google::spanner::admin::instance::v1::GetInstanceConfigRequest const &, Options)
- CreateInstanceConfig(std::string const &, google::spanner::admin::instance::v1::InstanceConfig const &, std::string const &, Options)
- CreateInstanceConfig(NoAwaitTag, std::string const &, google::spanner::admin::instance::v1::InstanceConfig const &, std::string const &, Options)
- CreateInstanceConfig(google::spanner::admin::instance::v1::CreateInstanceConfigRequest const &, Options)
- CreateInstanceConfig(NoAwaitTag, google::spanner::admin::instance::v1::CreateInstanceConfigRequest const &, Options)
- CreateInstanceConfig(google::longrunning::Operation const &, Options)
- UpdateInstanceConfig(google::spanner::admin::instance::v1::InstanceConfig const &, google::protobuf::FieldMask const &, Options)
- UpdateInstanceConfig(NoAwaitTag, google::spanner::admin::instance::v1::InstanceConfig const &, google::protobuf::FieldMask const &, Options)
- UpdateInstanceConfig(google::spanner::admin::instance::v1::UpdateInstanceConfigRequest const &, Options)
- UpdateInstanceConfig(NoAwaitTag, google::spanner::admin::instance::v1::UpdateInstanceConfigRequest const &, Options)
- UpdateInstanceConfig(google::longrunning::Operation const &, Options)
- DeleteInstanceConfig(std::string const &, Options)
- DeleteInstanceConfig(google::spanner::admin::instance::v1::DeleteInstanceConfigRequest const &, Options)
- ListInstanceConfigOperations(std::string const &, Options)
- ListInstanceConfigOperations(google::spanner::admin::instance::v1::ListInstanceConfigOperationsRequest, Options)
- ListInstances(std::string const &, Options)
- ListInstances(google::spanner::admin::instance::v1::ListInstancesRequest, Options)
- ListInstancePartitions(std::string const &, Options)
- ListInstancePartitions(google::spanner::admin::instance::v1::ListInstancePartitionsRequest, Options)
- GetInstance(std::string const &, Options)
- GetInstance(google::spanner::admin::instance::v1::GetInstanceRequest const &, Options)
- CreateInstance(std::string const &, std::string const &, google::spanner::admin::instance::v1::Instance const &, Options)
- CreateInstance(NoAwaitTag, std::string const &, std::string const &, google::spanner::admin::instance::v1::Instance const &, Options)
- CreateInstance(google::spanner::admin::instance::v1::CreateInstanceRequest const &, Options)
- CreateInstance(NoAwaitTag, google::spanner::admin::instance::v1::CreateInstanceRequest const &, Options)
- CreateInstance(google::longrunning::Operation const &, Options)
- UpdateInstance(google::spanner::admin::instance::v1::Instance const &, google::protobuf::FieldMask const &, Options)
- UpdateInstance(NoAwaitTag, google::spanner::admin::instance::v1::Instance const &, google::protobuf::FieldMask const &, Options)
- UpdateInstance(google::spanner::admin::instance::v1::UpdateInstanceRequest const &, Options)
- UpdateInstance(NoAwaitTag, google::spanner::admin::instance::v1::UpdateInstanceRequest const &, Options)
- UpdateInstance(google::longrunning::Operation const &, Options)
- DeleteInstance(std::string const &, Options)
- DeleteInstance(google::spanner::admin::instance::v1::DeleteInstanceRequest const &, Options)
- SetIamPolicy(std::string const &, google::iam::v1::Policy const &, Options)
- SetIamPolicy(std::string const &, IamUpdater const &, Options)
- SetIamPolicy(google::iam::v1::SetIamPolicyRequest const &, Options)
- GetIamPolicy(std::string const &, Options)
- GetIamPolicy(google::iam::v1::GetIamPolicyRequest const &, Options)
- TestIamPermissions(std::string const &, std::vector< std::string > const &, Options)
- TestIamPermissions(google::iam::v1::TestIamPermissionsRequest const &, Options)
- GetInstancePartition(std::string const &, Options)
- GetInstancePartition(google::spanner::admin::instance::v1::GetInstancePartitionRequest const &, Options)
- CreateInstancePartition(std::string const &, google::spanner::admin::instance::v1::InstancePartition const &, std::string const &, Options)
- CreateInstancePartition(NoAwaitTag, std::string const &, google::spanner::admin::instance::v1::InstancePartition const &, std::string const &, Options)
- CreateInstancePartition(google::spanner::admin::instance::v1::CreateInstancePartitionRequest const &, Options)
- CreateInstancePartition(NoAwaitTag, google::spanner::admin::instance::v1::CreateInstancePartitionRequest const &, Options)
- CreateInstancePartition(google::longrunning::Operation const &, Options)
- DeleteInstancePartition(std::string const &, Options)
- DeleteInstancePartition(google::spanner::admin::instance::v1::DeleteInstancePartitionRequest const &, Options)
- UpdateInstancePartition(google::spanner::admin::instance::v1::InstancePartition const &, google::protobuf::FieldMask const &, Options)
- UpdateInstancePartition(NoAwaitTag, google::spanner::admin::instance::v1::InstancePartition const &, google::protobuf::FieldMask const &, Options)
- UpdateInstancePartition(google::spanner::admin::instance::v1::UpdateInstancePartitionRequest const &, Options)
- UpdateInstancePartition(NoAwaitTag, google::spanner::admin::instance::v1::UpdateInstancePartitionRequest const &, Options)
- UpdateInstancePartition(google::longrunning::Operation const &, Options)
- ListInstancePartitionOperations(std::string const &, Options)
- ListInstancePartitionOperations(google::spanner::admin::instance::v1::ListInstancePartitionOperationsRequest, Options)
- MoveInstance(google::spanner::admin::instance::v1::MoveInstanceRequest const &, Options)
- MoveInstance(NoAwaitTag, google::spanner::admin::instance::v1::MoveInstanceRequest const &, Options)
- MoveInstance(google::longrunning::Operation const &, Options)
- ListOperations(std::string const &, std::string const &, Options)
- ListOperations(google::longrunning::ListOperationsRequest, Options)
- GetOperation(std::string const &, Options)
- GetOperation(google::longrunning::GetOperationRequest const &, Options)
- DeleteOperation(std::string const &, Options)
- DeleteOperation(google::longrunning::DeleteOperationRequest const &, Options)
- CancelOperation(std::string const &, Options)
- CancelOperation(google::longrunning::CancelOperationRequest const &, Options)
-
InstanceAdminConnectionIdempotencyPolicy
-
InstanceAdminLimitedErrorCountRetryPolicy
-
InstanceAdminLimitedTimeRetryPolicy
-
Structs
-
DatabaseAdminBackoffPolicyOption
-
DatabaseAdminConnectionIdempotencyPolicyOption
-
DatabaseAdminPollingPolicyOption
-
InstanceAdminBackoffPolicyOption
-
InstanceAdminConnectionIdempotencyPolicyOption
-
InstanceAdminPollingPolicyOption
-
google::cloud::spanner_admin_mocks
-
google::cloud::spanner_experimental
Stay organized with collections Save and categorize content based on your preferences.
Mocking the Cloud Spanner C++ Client with Google Mock
In this document we describe how to write unit tests that mock google::cloud::spanner::Client
using Google Mock. This document assumes the reader is familiar with the Google Test and Google Mock frameworks and with the Cloud Spanner C++ Client.
Mocking a successful ExecuteQuery
First include the headers for the Cloud Spanner Client, the mocking class, and the Google Mock framework.
#include "google/cloud/spanner/client.h"
#include "google/cloud/spanner/mocks/mock_spanner_connection.h"
#include "google/cloud/spanner/mocks/row.h"
#include <google/protobuf/text_format.h>
#include <gmock/gmock.h>
The example uses a number of aliases to save typing and improve readability:
using ::testing::Return;
namespace spanner = ::google::cloud::spanner;
Create a mocking object for google::cloud::spanner::Connection
:
auto conn = std::make_shared<google::cloud::spanner_mocks::MockConnection>();
We will setup this mock in a second, but first let's look at how it is used to create a google::cloud::spanner::Client
object:
spanner::Client client(conn);
Once the client is created you can make calls on the client as usual:
auto rows = client.ExecuteQuery(
spanner::SqlStatement("SELECT Id, Greeting FROM Greetings"));
And then verify the results meet your expectations:
int count = 0;
using RowType = std::tuple<std::int64_t, std::string>;
for (auto const& row : spanner::StreamOf<RowType>(rows)) {
ASSERT_TRUE(row);
auto expected_id = ++count;
EXPECT_EQ(expected_id, std::get<0>(*row));
EXPECT_EQ("Hello World", std::get<1>(*row));
}
All of this depends on creating a google::cloud::spanner::RowStream
that simulates the stream of results you want. To do so, you need to mock a source that streams google::cloud::spanner::Row
s:
auto source =
std::make_unique<google::cloud::spanner_mocks::MockResultSetSource>();
The source must define the names and types of the columns returned by the query:
auto constexpr kText = R"pb(
row_type: {
fields: {
name: "Id",
type: { code: INT64 }
}
fields: {
name: "Greeting",
type: { code: STRING }
}
})pb";
google::spanner::v1::ResultSetMetadata metadata;
ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(kText, &metadata));
EXPECT_CALL(*source, Metadata()).WillRepeatedly(Return(metadata));
And then setup the mock to return the results. Note that the results are returned one value at a time, even if a row contains multiple values.
EXPECT_CALL(*source, NextRow())
.WillOnce(Return(google::cloud::spanner_mocks::MakeRow(
{{"Id", spanner::Value(1)},
{"Greeting", spanner::Value("Hello World")}})))
.WillOnce(Return(google::cloud::spanner_mocks::MakeRow(
{{"Id", spanner::Value(2)},
{"Greeting", spanner::Value("Hello World")}})))
Note that the last value in the stream is indicated by an absl::optional without a value:
.WillOnce(Return(spanner::Row()));
Once the source
has been created and its behavior mocked, you mock the behavior for ExecuteQuery
:
EXPECT_CALL(*conn, ExecuteQuery)
.WillOnce([&source](spanner::Connection::SqlParams const&)
-> spanner::RowStream {
return spanner::RowStream(std::move(source));
});
Full Listing
Finally we present the full code for this example:
#include "google/cloud/spanner/client.h"
#include "google/cloud/spanner/mocks/mock_spanner_connection.h"
#include "google/cloud/spanner/mocks/row.h"
#include <google/protobuf/text_format.h>
#include <gmock/gmock.h>
namespace {
using ::testing::Return;
namespace spanner = ::google::cloud::spanner;
TEST(MockSpannerClient, SuccessfulExecuteQuery) {
// Create a mock object to stream the results of a ExecuteQuery.
auto source =
std::make_unique<google::cloud::spanner_mocks::MockResultSetSource>();
// Setup the return type of the ExecuteQuery results:
auto constexpr kText = R"pb(
row_type: {
fields: {
name: "Id",
type: { code: INT64 }
}
fields: {
name: "Greeting",
type: { code: STRING }
}
})pb";
google::spanner::v1::ResultSetMetadata metadata;
ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(kText, &metadata));
EXPECT_CALL(*source, Metadata()).WillRepeatedly(Return(metadata));
// Setup the mock source to return some values:
EXPECT_CALL(*source, NextRow())
.WillOnce(Return(google::cloud::spanner_mocks::MakeRow(
{{"Id", spanner::Value(1)},
{"Greeting", spanner::Value("Hello World")}})))
.WillOnce(Return(google::cloud::spanner_mocks::MakeRow(
{{"Id", spanner::Value(2)},
{"Greeting", spanner::Value("Hello World")}})))
.WillOnce(Return(spanner::Row()));
// Create a mock for `spanner::Connection`:
auto conn = std::make_shared<google::cloud::spanner_mocks::MockConnection>();
// Setup the connection mock to return the results previously setup:
EXPECT_CALL(*conn, ExecuteQuery)
.WillOnce([&source](spanner::Connection::SqlParams const&)
-> spanner::RowStream {
return spanner::RowStream(std::move(source));
});
// Create a client with the mocked connection:
spanner::Client client(conn);
// Make the request and verify the expected results:
auto rows = client.ExecuteQuery(
spanner::SqlStatement("SELECT Id, Greeting FROM Greetings"));
int count = 0;
using RowType = std::tuple<std::int64_t, std::string>;
for (auto const& row : spanner::StreamOf<RowType>(rows)) {
ASSERT_TRUE(row);
auto expected_id = ++count;
EXPECT_EQ(expected_id, std::get<0>(*row));
EXPECT_EQ("Hello World", std::get<1>(*row));
}
}
} // namespace
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-08-14 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-14 UTC."],[],[]]
RetroSearch is an open source project built by @garambo
| Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4