Skip to content

Commit 7605c0a

Browse files
authored
Merge pull request #107 from opentween/fix-timeline-scheduler
TimelineScheduler関連の不具合を修正
2 parents 4116a50 + 1cb3f85 commit 7605c0a

4 files changed

Lines changed: 306 additions & 232 deletions

File tree

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
// OpenTween - Client of Twitter
2+
// Copyright (c) 2022 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3+
// All rights reserved.
4+
//
5+
// This file is part of OpenTween.
6+
//
7+
// This program is free software; you can redistribute it and/or modify it
8+
// under the terms of the GNU General public License as published by the Free
9+
// Software Foundation; either version 3 of the License, or (at your option)
10+
// any later version.
11+
//
12+
// This program is distributed in the hope that it will be useful, but
13+
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14+
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General public License
15+
// for more details.
16+
//
17+
// You should have received a copy of the GNU General public License along
18+
// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19+
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20+
// Boston, MA 02110-1301, USA.
21+
22+
using System;
23+
using System.Collections.Generic;
24+
using System.Linq;
25+
using System.Text;
26+
using System.Threading.Tasks;
27+
using Xunit;
28+
29+
namespace OpenTween
30+
{
31+
public class TimelineScheduerTest
32+
{
33+
private class TestTimelineScheduler : TimelineScheduler
34+
{
35+
public MockTimer mockTimer = new MockTimer(() => Task.CompletedTask);
36+
37+
public TestTimelineScheduler()
38+
: base()
39+
{
40+
}
41+
42+
protected override ITimer CreateTimer(Func<Task> callback)
43+
=> this.mockTimer = new MockTimer(callback);
44+
}
45+
46+
[Fact]
47+
public async Task Callback_Test()
48+
{
49+
using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
50+
{
51+
using var scheduler = new TestTimelineScheduler();
52+
var mockTimer = scheduler.mockTimer;
53+
54+
Assert.False(mockTimer.IsTimerRunning);
55+
56+
var count = 0;
57+
scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
58+
{
59+
count++;
60+
TestUtils.DriftTime(TimeSpan.FromSeconds(10));
61+
return Task.CompletedTask;
62+
};
63+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
64+
scheduler.Enabled = true;
65+
66+
Assert.True(mockTimer.IsTimerRunning);
67+
Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
68+
69+
// 0:00:00 - 0:00:10
70+
await mockTimer.Invoke();
71+
72+
Assert.True(mockTimer.IsTimerRunning);
73+
Assert.Equal(TimeSpan.FromSeconds(50), mockTimer.DueTime); // UpdateFunc 内で掛かった時間を減算する
74+
}
75+
}
76+
77+
[Fact]
78+
public async Task Callback_SystemResumeTest()
79+
{
80+
using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
81+
{
82+
using var scheduler = new TestTimelineScheduler();
83+
var mockTimer = scheduler.mockTimer;
84+
85+
Assert.False(mockTimer.IsTimerRunning);
86+
87+
var count = 0;
88+
scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
89+
{
90+
count++;
91+
return Task.CompletedTask;
92+
};
93+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
94+
scheduler.UpdateAfterSystemResume = TimeSpan.FromMinutes(10);
95+
scheduler.Enabled = true;
96+
97+
Assert.True(mockTimer.IsTimerRunning);
98+
Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
99+
100+
// 0:00:00
101+
await mockTimer.Invoke();
102+
103+
Assert.Equal(1, count); // invoked
104+
Assert.True(mockTimer.IsTimerRunning);
105+
Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
106+
107+
scheduler.SystemResumed();
108+
109+
Assert.True(mockTimer.IsTimerRunning);
110+
Assert.Equal(TimeSpan.FromMinutes(10), mockTimer.DueTime);
111+
112+
// 0:10:00
113+
TestUtils.DriftTime(TimeSpan.FromMinutes(10));
114+
await mockTimer.Invoke();
115+
116+
Assert.Equal(2, count); // invoked
117+
Assert.True(mockTimer.IsTimerRunning);
118+
Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
119+
}
120+
}
121+
122+
[Fact]
123+
public void RefreshSchedule_Test()
124+
{
125+
using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
126+
{
127+
using var scheduler = new TestTimelineScheduler();
128+
var mockTimer = scheduler.mockTimer;
129+
130+
scheduler.Enabled = true;
131+
Assert.False(mockTimer.IsTimerRunning);
132+
133+
scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
134+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
135+
scheduler.RefreshSchedule();
136+
137+
Assert.True(mockTimer.IsTimerRunning);
138+
Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
139+
}
140+
}
141+
142+
[Fact]
143+
public void RefreshSchedule_EmptyTest()
144+
{
145+
using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
146+
{
147+
using var scheduler = new TestTimelineScheduler();
148+
var mockTimer = scheduler.mockTimer;
149+
150+
scheduler.Enabled = true;
151+
Assert.False(mockTimer.IsTimerRunning);
152+
153+
scheduler.RefreshSchedule();
154+
Assert.False(mockTimer.IsTimerRunning);
155+
}
156+
}
157+
158+
[Fact]
159+
public void RefreshSchedule_MultipleTest()
160+
{
161+
using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
162+
{
163+
using var scheduler = new TestTimelineScheduler();
164+
var mockTimer = scheduler.mockTimer;
165+
166+
scheduler.Enabled = true;
167+
Assert.False(mockTimer.IsTimerRunning);
168+
169+
scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
170+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
171+
scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now;
172+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
173+
scheduler.RefreshSchedule();
174+
175+
Assert.True(mockTimer.IsTimerRunning);
176+
Assert.Equal(TimeSpan.FromMinutes(2), mockTimer.DueTime);
177+
178+
scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
179+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
180+
scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now - TimeSpan.FromMinutes(2);
181+
scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
182+
scheduler.RefreshSchedule();
183+
184+
Assert.True(mockTimer.IsTimerRunning);
185+
Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
186+
}
187+
}
188+
}
189+
}

OpenTween/Resources/ChangeLog.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
* FIX: URL自動短縮の設定値が正しく表示されない不具合を修正
1818
* FIX: 関連発言表示で一部のツイートの読み込みがエラーになると関連発言タブに何も表示されなくなる不具合を修正
1919
* FIX: 英語版のメッセージのtypoを修正 (thx @TheQuinbox!)
20+
* FIX: スリープからの復帰後に発言一覧の自動更新が停止する場合がある不具合を修正
21+
* FIX: システムの日時を変更すると発言一覧の更新間隔が正しく計算されない場合がある不具合を修正
2022

2123
==== Ver 2.4.3(2019/12/06)
2224
* FIX: 関連発言表示のタブを読み込み中に閉じるとエラーが発生する不具合を修正

0 commit comments

Comments
 (0)