Browse Source

Fix locking.

pull/971/head
Sebastian 3 years ago
parent
commit
cba2d32013
  1. 52
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs
  2. 1
      backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryService.cs
  3. 1
      backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryService.cs
  4. 2
      backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs
  5. 1
      backend/src/Squidex.Domain.Apps.Entities/Teams/Indexes/TeamsIndex.cs
  6. 1
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs
  7. 1
      backend/src/Squidex/Config/Domain/ContentsServices.cs
  8. 1
      backend/src/Squidex/Config/Web/WebServices.cs
  9. 42
      backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs
  10. 1
      backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs
  11. 54
      frontend/src/app/framework/angular/pipes/highlight.pipe.spec.ts

52
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs

@ -86,23 +86,21 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
return;
}
slimLock.EnterWriteLock();
try
lock (Engine)
{
TryStart();
try
{
TryStart();
Engine.ResetConstraints();
action();
Engine.ResetConstraints();
action();
TryComplete(default!);
}
catch (Exception ex)
{
TryFail(ex);
}
finally
{
slimLock.ExitWriteLock();
TryComplete(default!);
}
catch (Exception ex)
{
TryFail(ex);
}
}
}
@ -113,23 +111,21 @@ public sealed class ScriptExecutionContext<T> : ScriptExecutionContext, ISchedul
return;
}
slimLock.EnterWriteLock();
try
lock (Engine)
{
TryStart();
try
{
TryStart();
Engine.ResetConstraints();
action(argument);
Engine.ResetConstraints();
action(argument);
TryComplete(default!);
}
catch (Exception ex)
{
TryFail(ex);
}
finally
{
slimLock.ExitWriteLock();
TryComplete(default!);
}
catch (Exception ex)
{
TryFail(ex);
}
}
}

1
backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryService.cs

@ -8,7 +8,6 @@
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Entities.Assets.Repositories;
using Squidex.Infrastructure;
using System.Diagnostics;
namespace Squidex.Domain.Apps.Entities.Assets.Queries;

1
backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryService.cs

@ -5,7 +5,6 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Diagnostics;
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Entities.Contents.Repositories;
using Squidex.Domain.Apps.Entities.Schemas;

2
backend/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasIndex.cs

@ -13,8 +13,6 @@ using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.States;
using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation;
using System.Diagnostics;
using System.Xml.Linq;
namespace Squidex.Domain.Apps.Entities.Schemas.Indexes;

1
backend/src/Squidex.Domain.Apps.Entities/Teams/Indexes/TeamsIndex.cs

@ -7,7 +7,6 @@
using Squidex.Domain.Apps.Entities.Teams.Repositories;
using Squidex.Infrastructure;
using System.Diagnostics;
namespace Squidex.Domain.Apps.Entities.Teams.Indexes;

1
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs

@ -10,7 +10,6 @@ using System.Text.Json.Serialization;
using NodaTime;
using Squidex.Domain.Apps.Entities;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Queries;
using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation;

1
backend/src/Squidex/Config/Domain/ContentsServices.cs

@ -17,7 +17,6 @@ using Squidex.Domain.Apps.Entities.Contents.Validation;
using Squidex.Domain.Apps.Entities.History;
using Squidex.Domain.Apps.Entities.Search;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Web.GraphQL;
namespace Squidex.Config.Domain;

1
backend/src/Squidex/Config/Web/WebServices.cs

@ -17,7 +17,6 @@ using Squidex.Config.Domain;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents.GraphQL;
using Squidex.Domain.Apps.Entities.Contents.Queries;
using Squidex.Infrastructure.Caching;
using Squidex.Infrastructure.Json.Objects;
using Squidex.Pipeline.Plugins;

42
backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs

@ -7,7 +7,6 @@
using System.Net;
using System.Security.Claims;
using Jint.Native;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Core.Contents;
@ -77,6 +76,15 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
scheduler.Run(callback);
});
}));
context.Engine.SetValue("setSyncTimeout", new Delay(callback =>
{
context.Schedule((scheduler, ct) =>
{
scheduler.Run(callback);
return Task.CompletedTask;
});
}));
}
}
@ -628,7 +636,7 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
["value"] = 13
};
const string script1 = @"
const string script = @"
var x = ctx.value;
for (var i = 0; i < 100; i++) {
setTimeout(function () {
@ -638,7 +646,35 @@ public class JintScriptEngineTests : IClassFixture<TranslationsFixture>
}
";
await sut.ExecuteAsync(vars, script1, new ScriptOptions { AsContext = true });
await sut.ExecuteAsync(vars, script, new ScriptOptions { AsContext = true });
Assert.Equal(113.0, vars["shared"]);
}
}
[Fact]
public async Task Should_not_run_nested_callbacks_in_parallel()
{
for (var i = 0; i < 10; i++)
{
var vars = new DataScriptVars
{
["value"] = 13
};
const string script = @"
var x = ctx.value;
for (var i = 0; i < 100; i++) {
setSyncTimeout(function () {
setSyncTimeout(function () {
x++;
ctx.shared = x;
});
});
}
";
await sut.ExecuteAsync(vars, script, new ScriptOptions { AsContext = true });
Assert.Equal(113.0, vars["shared"]);
}

1
backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs

@ -6,7 +6,6 @@
// ==========================================================================
using System.Security.Claims;
using Squidex.Domain.Apps.Core;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Apps;

54
frontend/src/app/framework/angular/pipes/highlight.pipe.spec.ts

@ -0,0 +1,54 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { HighlightPipe } from './highlight.pipe';
describe('Hightlight', () => {
const pipe = new HighlightPipe();
[null, undefined, ''].forEach(search => {
it('should not highlight if no search passed', () => {
const input = 'Hello World';
const result = pipe.transform(input, search);
expect(result).toEqual(input);
});
});
it('should encode html if no search specified', () => {
const input = '<h1>Hello World</h1>';
const result = pipe.transform(input, null);
expect(result).toEqual('&lt;h1&gt;Hello World&lt;/h1&gt;');
});
it('should highlight with search string', () => {
const input = 'Hello World';
const result = pipe.transform(input, 'ello');
expect(result).toEqual('H<b>ello</b> World');
});
it('should highlight with search regex', () => {
const input = 'Hello World';
const result = pipe.transform(input, new RegExp('ello', 'i'));
expect(result).toEqual('H<b>ello</b> World');
});
it('should encode html if search specified', () => {
const input = '<h1>Hello World</h1>';
const result = pipe.transform(input, 'ello');
expect(result).toEqual('&lt;h1&gt;H<b>ello</b> World&lt;/h1&gt;');
});
});
Loading…
Cancel
Save