Skip to content

Commit 1f76a82

Browse files
committed
Update to mirror JnienvCreateInstance_RegistersMultipleInstances
Context: dotnet/android#10004 It looks like dotnet/android#10004 is closely tied to dotnet/android#9862. Might as well update tests to hit this behavior!
1 parent f38a946 commit 1f76a82

File tree

2 files changed

+87
-14
lines changed

2 files changed

+87
-14
lines changed

Diff for: tests/Java.Interop-Tests/Java.Interop/CallVirtualFromConstructorDerived.cs

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using System;
1+
#nullable enable
2+
3+
using System;
4+
using System.Runtime.CompilerServices;
25

36
using Java.Interop;
47

@@ -35,10 +38,15 @@ public CallVirtualFromConstructorDerived (int value)
3538

3639
public bool InvokedActivationConstructor;
3740

41+
public static CallVirtualFromConstructorDerived? Intermediate_FromCalledFromConstructor;
42+
public static CallVirtualFromConstructorDerived? Intermediate_FromActivationConstructor;
43+
3844
public CallVirtualFromConstructorDerived (ref JniObjectReference reference, JniObjectReferenceOptions options)
3945
: base (ref reference, options)
4046
{
4147
InvokedActivationConstructor = true;
48+
49+
Intermediate_FromActivationConstructor = this;
4250
}
4351

4452
public bool Called;
@@ -47,14 +55,16 @@ public override void CalledFromConstructor (int value)
4755
{
4856
Called = true;
4957
calledValue = value;
58+
59+
Intermediate_FromCalledFromConstructor = this;
5060
}
5161

5262
public static unsafe CallVirtualFromConstructorDerived NewInstance (int value)
5363
{
5464
JniArgumentValue* args = stackalloc JniArgumentValue [1];
5565
args [0] = new JniArgumentValue (value);
5666
var o = _members.StaticMethods.InvokeObjectMethod ("newInstance.(I)Lnet/dot/jni/test/CallVirtualFromConstructorDerived;", args);
57-
return JniEnvironment.Runtime.ValueManager.GetValue<CallVirtualFromConstructorDerived> (ref o, JniObjectReferenceOptions.CopyAndDispose);
67+
return JniEnvironment.Runtime.ValueManager.GetValue<CallVirtualFromConstructorDerived> (ref o, JniObjectReferenceOptions.CopyAndDispose)!;
5868
}
5969

6070
delegate void CalledFromConstructorMarshalMethod (IntPtr jnienv, IntPtr n_self, int value);
@@ -63,7 +73,7 @@ static void CalledFromConstructorHandler (IntPtr jnienv, IntPtr n_self, int valu
6373
var envp = new JniTransition (jnienv);
6474
try {
6575
var r_self = new JniObjectReference (n_self);
66-
var self = JniEnvironment.Runtime.ValueManager.GetValue<CallVirtualFromConstructorDerived>(ref r_self, JniObjectReferenceOptions.Copy);
76+
var self = JniEnvironment.Runtime.ValueManager.GetValue<CallVirtualFromConstructorDerived>(ref r_self, JniObjectReferenceOptions.Copy)!;
6777
self.CalledFromConstructor (value);
6878
self.DisposeUnlessReferenced ();
6979
}

Diff for: tests/Java.Interop-Tests/Java.Interop/InvokeVirtualFromConstructorTests.cs

+74-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.CompilerServices;
23

34
using Java.Interop;
45

@@ -7,25 +8,87 @@
78
namespace Java.InteropTests {
89

910
[TestFixture]
11+
#if !__ANDROID__
12+
// We want stability around the CallVirtualFromConstructorDerived static fields
13+
[NonParallelizable]
14+
#endif // !__ANDROID__
1015
public class InvokeVirtualFromConstructorTests : JavaVMFixture
1116
{
1217
[Test]
13-
public void InvokeVirtualFromConstructor ()
18+
public void CreateManagedInstanceFirst ()
1419
{
15-
using (var t = new CallVirtualFromConstructorDerived (42)) {
16-
Assert.IsTrue (t.Called);
17-
Assert.IsNotNull (JniRuntime.CurrentRuntime.ValueManager.PeekValue (t.PeerReference));
18-
}
20+
CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor = null;
21+
CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor = null;
22+
23+
using var t = new CallVirtualFromConstructorDerived (42);
24+
Assert.IsTrue (
25+
t.Called,
26+
"CalledFromConstructor method override should have been called.");
27+
Assert.IsFalse (
28+
t.InvokedActivationConstructor,
29+
"Activation Constructor should have been called, as calledFromConstructor() is invoked before ManagedPeer.construct().");
30+
Assert.IsTrue (
31+
t.InvokedConstructor,
32+
"(int) constructor should have been called, via ManagedPeer.construct().");
33+
34+
var registered = JniRuntime.CurrentRuntime.ValueManager.PeekValue (t.PeerReference);
35+
var acIntermediate = CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor;
36+
var cfIntermediate = CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor;
37+
38+
Assert.AreSame (t, registered,
39+
"Expected t and registered to be the same instance; " +
40+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
41+
$"registered={RuntimeHelpers.GetHashCode (registered).ToString ("x")}");
42+
Assert.AreNotSame (t, acIntermediate,
43+
"Expected t and registered to be the same instance; " +
44+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
45+
$"registered={RuntimeHelpers.GetHashCode (registered).ToString ("x")}");
46+
Assert.AreSame (t, cfIntermediate,
47+
"Expected t and cfIntermediate to be the same instance; " +
48+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
49+
$"cfIntermediate={RuntimeHelpers.GetHashCode (cfIntermediate).ToString ("x")}");
50+
51+
CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor = null;
52+
CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor = null;
1953
}
2054

2155
[Test]
22-
public void ActivationConstructor ()
56+
public void CreateJavaInstanceFirst ()
2357
{
24-
var t = CallVirtualFromConstructorDerived.NewInstance (42);
25-
using (t) {
26-
Assert.IsTrue (t.InvokedActivationConstructor);
27-
Assert.IsTrue (t.InvokedConstructor);
28-
}
58+
CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor = null;
59+
CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor = null;
60+
61+
using var t = CallVirtualFromConstructorDerived.NewInstance (42);
62+
63+
Assert.IsTrue (
64+
t.Called,
65+
"CalledFromConstructor method override should have been called.");
66+
Assert.IsTrue (
67+
t.InvokedActivationConstructor,
68+
"Activation Constructor should have been called, as calledFromConstructor() is invoked before ManagedPeer.construct().");
69+
Assert.IsTrue (
70+
t.InvokedConstructor,
71+
"(int) constructor should have been called, via ManagedPeer.construct().");
72+
73+
var registered = JniRuntime.CurrentRuntime.ValueManager.PeekValue (t.PeerReference);
74+
var acIntermediate = CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor;
75+
var cfIntermediate = CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor;
76+
77+
Assert.AreSame (t, registered,
78+
"Expected t and registered to be the same instance; " +
79+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
80+
$"registered={RuntimeHelpers.GetHashCode (registered).ToString ("x")}");
81+
Assert.AreSame (t, acIntermediate,
82+
"Expected t and registered to be the same instance; " +
83+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
84+
$"registered={RuntimeHelpers.GetHashCode (registered).ToString ("x")}");
85+
Assert.AreSame (t, cfIntermediate,
86+
"Expected t and cfIntermediate to be the same instance; " +
87+
$"t={RuntimeHelpers.GetHashCode (t).ToString ("x")}, " +
88+
$"cfIntermediate={RuntimeHelpers.GetHashCode (cfIntermediate).ToString ("x")}");
89+
90+
CallVirtualFromConstructorDerived.Intermediate_FromActivationConstructor = null;
91+
CallVirtualFromConstructorDerived.Intermediate_FromCalledFromConstructor = null;
2992
}
3093
}
3194
}

0 commit comments

Comments
 (0)