blob: e74f2b0814092dcc98898bd1ec050e28e63b32ef [file] [log] [blame]
csharptest27bfcc52011-06-02 12:04:06 -05001using System;
2using Google.ProtocolBuffers.TestProtos;
3using NUnit.Framework;
4
5namespace Google.ProtocolBuffers.CompatTests
6{
7 public abstract class CompatibilityTests
8 {
9 protected abstract string TestName { get; }
10 protected abstract object SerializeMessage<TMessage, TBuilder>(TMessage message)
11 where TMessage : IMessageLite<TMessage, TBuilder>
12 where TBuilder : IBuilderLite<TMessage, TBuilder>;
13
14 protected abstract TBuilder DeerializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
15 where TMessage : IMessageLite<TMessage, TBuilder>
16 where TBuilder : IBuilderLite<TMessage, TBuilder>;
17
18 #region RunBenchmark
19
20 protected void RunBenchmark<TMessage, TBuilder>(byte[] buffer, bool write)
21 where TMessage : IMessageLite<TMessage, TBuilder>
22 where TBuilder : IBuilderLite<TMessage, TBuilder>, new()
23 {
24 TBuilder builder = new TBuilder();
25 TMessage message = new TBuilder().MergeFrom(buffer).Build();
26 System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
27 //simple warm-up
28 object content = SerializeMessage<TMessage, TBuilder>(message);
29 Assert.AreEqual(message, DeerializeMessage<TMessage, TBuilder>(content, new TBuilder(), ExtensionRegistry.Empty).Build());
30 //timming
31 long time = 0, sample = 1;
32 while (time < 100)
33 {
34 sample *= 10;
35 watch.Reset();
36 watch.Start();
37 if (write)
38 {
39 for (int i = 0; i < sample; i++)
40 SerializeMessage<TMessage, TBuilder>(message);
41 }
42 else
43 {
44 for (int i = 0; i < sample; i++)
45 DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
46 }
47 watch.Stop();
48 time = watch.ElapsedMilliseconds;
49 }
50
51 ulong rounds = (ulong)((100.0 / watch.ElapsedMilliseconds) * sample);
52 //test
53 watch.Reset();
54 watch.Start();
55
56 if (write)
57 {
58 for (ulong i = 0; i < rounds; i++)
59 SerializeMessage<TMessage, TBuilder>(message);
60 }
61 else
62 {
63 for (ulong i = 0; i < rounds; i++)
64 DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
65 }
66
67 watch.Stop();
68 System.Diagnostics.Trace.TraceInformation(
69 "\r\n{0} {4} {5} {3:n0} rps ({1:n0} rounds in {2:n0} ms)", typeof(TMessage).Name, rounds,
70 watch.ElapsedMilliseconds, (1000.0 / watch.ElapsedMilliseconds) * (double)rounds, TestName, write ? " write" : " read");
71 GC.GetTotalMemory(true);
72 GC.WaitForPendingFinalizers();
73 }
74
75 [Test]
76 public virtual void Message1OptimizeSizeWriterPerf()
77 {
78 RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, true);
79 }
80 [Test]
81 public virtual void Message1OptimizeSpeedWriterPerf()
82 {
83 RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, true);
84 }
85 [Test]
86 public virtual void Message2OptimizeSizeWriterPerf()
87 {
88 RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, true);
89 }
90 [Test]
91 public virtual void Message2OptimizeSpeedWriterPerf()
92 {
93 RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, true);
94 }
95
96 [Test]
97 public virtual void Message1OptimizeSizeReadPerf()
98 {
99 RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, false);
100 }
101 [Test]
102 public virtual void Message1OptimizeSpeedReadPerf()
103 {
104 RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, false);
105 }
106 [Test]
107 public virtual void Message2OptimizeSizeReadPerf()
108 {
109 RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, false);
110 }
111 [Test]
112 public virtual void Message2OptimizeSpeedReadPerf()
113 {
114 RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, false);
115 }
116
117 #endregion
118
119 [Test]
120 public virtual void RoundTripMessage1OptimizeSize()
121 {
122 SizeMessage1 msg = SizeMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
123 object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
124
125 SizeMessage1 copy = DeerializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
126
127 Assert.AreEqual(msg, copy);
128 Assert.AreEqual(content, SerializeMessage<SizeMessage1,SizeMessage1.Builder>(copy));
129 Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
130 }
131
132 [Test]
133 public virtual void RoundTripMessage2OptimizeSize()
134 {
135 SizeMessage2 msg = SizeMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
136 object content = SerializeMessage<SizeMessage2, SizeMessage2.Builder>(msg);
137
138 SizeMessage2 copy = DeerializeMessage<SizeMessage2, SizeMessage2.Builder>(content, SizeMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
139
140 Assert.AreEqual(msg, copy);
141 Assert.AreEqual(content, SerializeMessage<SizeMessage2, SizeMessage2.Builder>(copy));
142 Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
143 }
144
145 [Test]
146 public virtual void RoundTripMessage1OptimizeSpeed()
147 {
148 SpeedMessage1 msg = SpeedMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
149 object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
150
151 SpeedMessage1 copy = DeerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
152
153 Assert.AreEqual(msg, copy);
154 Assert.AreEqual(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
155 Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
156 }
157
158 [Test]
159 public virtual void RoundTripMessage2OptimizeSpeed()
160 {
161 SpeedMessage2 msg = SpeedMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
162 object content = SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(msg);
163
164 SpeedMessage2 copy = DeerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(content, SpeedMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
165
166 Assert.AreEqual(msg, copy);
167 Assert.AreEqual(content, SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(copy));
168 Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
169 }
170
171 }
172}