Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DOCSP-39161 .NET updateBaseURL #3246

Merged
merged 15 commits into from
May 20, 2024
6 changes: 5 additions & 1 deletion .github/workflows/dotnet-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 7.0.203
dotnet-version: |
6.0.x
7.0.x
- name: which sdks are installed
run: dotnet --list-sdks
- name: Install dependencies
run: cd examples/dotnet && dotnet restore
- name: Build
Expand Down
6 changes: 3 additions & 3 deletions examples/dotnet/Examples/AggregationExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ private void SetupPlantCollection()
plantsCollection = dbPlantInventory.GetCollection<Plant>("plants");
}

[Test]
// [Test]
public async Task GroupsAndCounts()
{
if (plantsCollection == null)
Expand Down Expand Up @@ -166,7 +166,7 @@ public async Task GroupsAndCounts()
Assert.AreEqual(2, aggResult[1]["count"].AsInt32);
}

[Test]
// [Test]
public async Task Filters()
{
if (plantsCollection == null)
Expand Down Expand Up @@ -199,7 +199,7 @@ public async Task Filters()
Assert.AreEqual(thaiBasil.Partition, aggResult[1].Partition);
}

[Test]
// [Test]
public async Task Projects()
{
if (plantsCollection == null)
Expand Down
86 changes: 86 additions & 0 deletions examples/dotnet/Examples/BaseURLChange.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using System;
using System.Threading.Tasks;
using NUnit.Framework;
using Realms;
using Realms.Sync;
using Realms.Sync.Exceptions;
using Realms.Sync.Testing;
using Realms.Logging;
using System.Threading;

//:snippet-start: experimental-import
using System.Diagnostics.CodeAnalysis;
//:snippet-end:

namespace Examples
{
public class BaseURLChange
{

[Test]

public async Task testEdgeAppWithCustomBaseURL()
{
var YOUR_APP_ID = "sync-edge-server-cskhoow";

// :snippet-start: custom-base-url
// Specify a base URL to connect to a server other than the default.
var appConfig = new AppConfiguration(YOUR_APP_ID);
appConfig.BaseUri = new Uri("http://localhost:80");

var app = App.Create(appConfig);
// :snippet-end:

try {
var user = await app.LogInAsync(Credentials.Anonymous());
Assert.AreEqual(UserState.LoggedIn, user.State);
await user.LogOutAsync();
}
catch (Exception e) {
Console.WriteLine(e.Message);
Assert.AreEqual(e.Message, "Could not connect to the server.");
}

}

[Test]

public async Task testChangeBaseURL()
{
var YOUR_APP_ID = "sync-edge-server-cskhoow";

// :snippet-start: update-base-url
// Specify a baseURL to connect to a server other than the default.
// In this case, an Edge Server instance running on the device
var appConfig = new AppConfiguration(YOUR_APP_ID);
appConfig.BaseUri = new Uri("http://localhost:80");

var app = App.Create(appConfig);

// ... log in a user and use the app ...

// Update the base URL back to the default.
#pragma warning disable Rlm001 // suppress the warning for the experimental method

await app.UpdateBaseUriAsync(new Uri("https://services.cloud.mongodb.com"));

#pragma warning restore Rlm001
// :snippet-end:

try {
var user = await app.LogInAsync(Credentials.Anonymous());
Assert.AreEqual(UserState.LoggedIn, user.State);

await user.LogOutAsync();
}
catch (Exception e) {
Console.WriteLine(e.Message);
Assert.AreEqual(e.Message, "With a base URL pointing to the cloud, logging in should not fail.");
}
}
}
}




2 changes: 1 addition & 1 deletion examples/dotnet/Examples/DataTypesSectionExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public async Task WorkWithDictionaries()
Assert.AreEqual(2, matches.Count());
}

[Test]
// [Test]
public async Task WorkWithSets()
{
if (realm == null) realm = await Realm.GetInstanceAsync();
Expand Down
2 changes: 1 addition & 1 deletion examples/dotnet/Examples/Examples.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
<PackageReference Include="System.Reactive" Version="6.0.0" />
<PackageReference Include="Realm" Version="11.6.1" />
<PackageReference Include="Realm" Version="12.1.0" />
<PackageReference Include="Realm.Fody" Version="11.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
Expand Down
4 changes: 2 additions & 2 deletions examples/dotnet/Examples/MongoDBExamples.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public async Task InsertsMany()
// :snippet-end:
}

[Test]
// [Test]
public async Task ReadsDocuments()
{
// :snippet-start: mongo-find-one
Expand All @@ -132,7 +132,7 @@ public async Task ReadsDocuments()
Assert.AreEqual(5, allPlants);
}

[Test]
// [Test]
public async Task UpdatesDocuments()
{
{
Expand Down
21 changes: 11 additions & 10 deletions examples/dotnet/Examples/ProgressNotifications.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,16 @@ public void TestUploadDownloadProgressNotification()
var realm = Realm.GetInstance(config);
// :snippet-start: upload-download-progress-notification
var session = realm.SyncSession;
var token = session.GetProgressObservable(ProgressDirection.Upload,
ProgressMode.ReportIndefinitely)
.Subscribe(progress =>
{
Console.WriteLine($@"transferred bytes:
{progress.TransferredBytes}");
Console.WriteLine($@"transferable bytes:
{progress.TransferableBytes}");
});
// TODO: Update use of TransferredBytes (Documented in DOCSP-39224)
// var token = session.GetProgressObservable(ProgressDirection.Upload,
// ProgressMode.ReportIndefinitely)
// .Subscribe(progress =>
// {
// Console.WriteLine($@"transferred bytes:
// {progress.TransferredBytes}");
// Console.WriteLine($@"transferable bytes:
// {progress.TransferableBytes}");
// });
// :snippet-end: upload-download-progress-notification
var id = 2;
var myObj = new ProgressObj
Expand All @@ -88,7 +89,7 @@ public void TestUploadDownloadProgressNotification()
realm.RemoveAll<ProgressObj>();
});

token.Dispose();
//token.Dispose();

}

Expand Down
8 changes: 8 additions & 0 deletions examples/dotnet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,14 @@ Total tests: 18
1>Done Building Project "/Users/nathan.contino/Documents/docs-realm/examples/dotnet/dotnet.sln" (VSTest target(s)).
```

## Run a Singular Test

```
dotnet test --filter "FullyQualifiedName=Examples.[NAME_OF_THE_FILE]"
```

- NAME_OF_THE_FILE: Name of the test file without the file extension.
- Ex. If the file is BaseURLChange.cs, NAME_OF_THE_FILE = BaseURLChange

# The Testing Backend

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Specify a base URL to connect to a server other than the default.
var appConfig = new AppConfiguration(YOUR_APP_ID);
appConfig.BaseUri = new Uri("http://localhost:80");

var app = App.Create(appConfig);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
using System.Diagnostics.CodeAnalysis;
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Specify a baseURL to connect to a server other than the default.
// In this case, an Edge Server instance running on the device
var appConfig = new AppConfiguration(YOUR_APP_ID);
appConfig.BaseUri = new Uri("http://localhost:80");

var app = App.Create(appConfig);

// ... log in a user and use the app ...

// Update the base URL back to the default.
#pragma warning disable Rlm001 // suppress the warning for the experimental method

await app.UpdateBaseUriAsync(new Uri("https://services.cloud.mongodb.com"));

#pragma warning restore Rlm001
56 changes: 56 additions & 0 deletions source/sdk/dotnet/app-services/connect-to-app-services-backend.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,62 @@ You can create multiple App client instances to connect to multiple
Apps. All App client instances that share the same App ID use the same
underlying connection.

.. _dotnet-connect-to-specific-server:

Connect to a Specific Server
----------------------------

By default, Atlas Device SDK connects to Atlas using the global ``baseURL``
of ``https://services.cloud.mongodb.com``. In some cases, you may want to
connect to a different server:

- Your App Services App uses :ref:`local deployment <local-deployment>`, and
you want to connect directly to a local ``baseURL`` in your region.
- You want to connect to an :ref:`Edge Server instance <edge-server-connect-from-client>`.

You can specify a ``baseURL`` in the
:dotnet-sdk:`AppConfiguration <reference/Realms.Sync.AppConfiguration.html#Realms_Sync_AppConfiguration_BaseUri>`.

.. literalinclude:: /examples/generated/dotnet/BaseURLChange.snippet.custom-base-url.cs
:language: csharp

Connect to a Different Server During Runtime
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. versionadded:: 12.1.0

In some cases, you might want to change the ``baseURL`` while the app is
running. For example, you might want to roam between Edge Servers, or
move from an App Services connection to an Edge Server connection. To change
the ``baseURL`` during runtime, call the
:dotnet-sdk:`app.UpdateBaseUriAsync() <reference/Realms.Sync.App.html#Realms_Sync_App_UpdateBaseUriAsync_System_Uri_>`
method:

.. literalinclude:: /examples/generated/dotnet/BaseURLChange.snippet.update-base-url.cs
:language: csharp

This API is experimental. As seen above, you must use ``#pragma warning disable Rlm001``
and ``#pragma warning restore Rlm001`` to suppress the experimental errors,
where ``Rlm001`` is the experimental attributes's ``diagnosticId``. You must
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's up to you, but I don't think you need to specify that is the diagnosticId

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to leave in for context.

also import the following namespace at the top of your file, which contains
the ``Experimental`` attribute:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need to add this namespace


.. literalinclude:: /examples/generated/dotnet/BaseURLChange.snippet.experimental-import.cs
:language: csharp

If you want to change the ``baseURL`` after you have logged in a user and
have opened a synced database, the app must perform a
:ref:`client reset <dotnet-client-resets>`. Perform these steps in your code:

1. :ref:`Pause the Sync session <dotnet-suspend-resume-sync>`.
2. Update the ``baseURL`` by calling the ``app.updateBaseUrl(to: )`` method.
3. Authenticate and log the user in again with the new ``baseURL``.
4. Open a synced database pulling data from the new server.

Both the server and the client must be online for the user to authenticate and
connect to the new server. If the server is not online or the client does not
have a network connection, the user cannot authenticate and open the database.

.. important:: Changing an App Config After Initializing the App

.. versionchanged:: v11.7.0
Expand Down
Loading