1<?php
2/*
3 * Unit tests for Horde_ActiveSync_Folder_Imap
4 *
5 * @author Michael J. Rubinsky <mrubinsk@horde.org>
6 * @category Horde
7 * @package ActiveSync
8 */
9class Horde_ActiveSync_ImapFolderTest extends Horde_Test_Case
10{
11    public function testInitialState()
12    {
13        $folder = new Horde_ActiveSync_Folder_Imap('INBOX', Horde_ActiveSync::CLASS_EMAIL);
14        $thrown = false;
15        try {
16            $folder->checkValidity(array(Horde_ActiveSync_Folder_Imap::UIDVALIDITY => '123'));
17        } catch (Horde_ActiveSync_Exception $e) {
18            $thrown = true;
19        }
20        $this->assertEquals(true, $thrown);
21        $this->assertEquals(0, $folder->uidnext());
22        $this->assertEquals(0, $folder->modseq());
23        $this->assertEquals(array(), $folder->messages());
24        $this->assertEquals(array(), $folder->flags());
25        $this->assertEquals(array(), $folder->added());
26        $this->assertEquals(array(), $folder->changed());
27        $this->assertEquals(array(), $folder->removed());
28        $this->assertEquals(0, $folder->minuid());
29    }
30
31    public function testNoModseqUpdate()
32    {
33        $folder = new Horde_ActiveSync_Folder_Imap('INBOX', Horde_ActiveSync::CLASS_EMAIL);
34        $status = array(Horde_ActiveSync_Folder_Imap::UIDVALIDITY => 100, Horde_ActiveSync_Folder_Imap::UIDNEXT => 105);
35
36        // Initial state for nonmodseq
37        $msg_changes = array(100, 101, 102, 103, 104);
38        $flag_changes = array(
39            100 => array('read' => 0, 'flagged' => 0),
40            101 => array('read' => 0, 'flagged' => 0),
41            102 => array('read' => 0, 'flagged' => 0),
42            103 => array('read' => 0, 'flagged' => 0),
43            104 => array('read' => 0, 'flagged' => 0),
44        );
45        $folder->setChanges($msg_changes, $flag_changes);
46
47        $this->assertEquals($msg_changes, $folder->added());
48        $this->assertEquals($flag_changes, $folder->flags());
49        $this->assertEquals(array(), $folder->changed());
50        $this->assertEquals(array(), $folder->removed());
51        $this->assertEquals(array(), $folder->messages());
52
53
54        $folder->setStatus($status);
55        $folder->updateState();
56
57        $this->assertEquals(array(), $folder->added());
58        $this->assertEquals(array(), $folder->flags());
59        $this->assertEquals(array(), $folder->changed());
60        $this->assertEquals(array(), $folder->removed());
61        $this->assertEquals($msg_changes, $folder->messages());
62
63        // Now simulate some flag changes and new messages.
64        $msg_changes = array(100, 101, 102, 103, 104, 105);
65        $flag_changes = array(
66            100 => array('read' => 0, 'flagged' => 1),
67            101 => array('read' => 0, 'flagged' => 0),
68            102 => array('read' => 0, 'flagged' => 0),
69            103 => array('read' => 0, 'flagged' => 0),
70            104 => array('read' => 0, 'flagged' => 0),
71            105 => array('read' => 1, 'flagged' => 0),
72        );
73        $folder->setChanges($msg_changes, $flag_changes);
74        $this->assertEquals(array(105), $folder->added());
75        $this->assertEquals(array(100), $folder->changed());
76
77        $status[Horde_ActiveSync_Folder_Imap::UIDNEXT] = 106;
78        $folder->setStatus($status);
79        $folder->updateState();
80    }
81
82    public function testModseqUpdate()
83    {
84        $folder = new Horde_ActiveSync_Folder_Imap('INBOX', Horde_ActiveSync::CLASS_EMAIL);
85        $status = array(Horde_ActiveSync_Folder_Imap::UIDVALIDITY => 100, Horde_ActiveSync_Folder_Imap::UIDNEXT => 105, Horde_ActiveSync_Folder_Imap::HIGHESTMODSEQ => 200);
86
87        // Initial state
88        $msg_changes = array(100, 101, 102, 103, 104);
89        $flag_changes = array(
90            100 => array('read' => 0, 'flagged' => 0),
91            101 => array('read' => 0, 'flagged' => 0),
92            102 => array('read' => 0, 'flagged' => 0),
93            103 => array('read' => 0, 'flagged' => 0),
94            104 => array('read' => 0, 'flagged' => 0),
95        );
96        $folder->setChanges($msg_changes, $flag_changes);
97
98        $this->assertEquals($msg_changes, $folder->added());
99        $this->assertEquals($flag_changes, $folder->flags());
100        $this->assertEquals(array(), $folder->changed());
101        $this->assertEquals(array(), $folder->removed());
102        $this->assertEquals(array(), $folder->messages());
103        $folder->setStatus($status);
104        $folder->updateState();
105        $this->assertEquals(array(), $folder->added());
106        $this->assertEquals(array(), $folder->flags());
107        $this->assertEquals(array(), $folder->changed());
108        $this->assertEquals(array(), $folder->removed());
109        $this->assertEquals($msg_changes, $folder->messages());
110
111        // Now simulate some flag changes and new messages.
112        $msg_changes = array(100, 105);
113        $flag_changes = array(
114            100 => array('read' => 0, 'flagged' => 1),
115            105 => array('read' => 1, 'flagged' => 0),
116        );
117        $folder->setChanges($msg_changes, $flag_changes);
118        $this->assertEquals(array(105), $folder->added());
119        $this->assertEquals(array(100), $folder->changed());
120
121        $status[Horde_ActiveSync_Folder_Imap::UIDNEXT] = 106;
122        $folder->setStatus($status);
123        $folder->updateState();
124    }
125
126    public function testSerializationWithImapCompression()
127    {
128        $folder = new Horde_ActiveSync_Folder_Imap('Trash', Horde_ActiveSync::CLASS_EMAIL);
129        $status = array(Horde_ActiveSync_Folder_Imap::UIDVALIDITY => 100, Horde_ActiveSync_Folder_Imap::UIDNEXT => 47654, Horde_ActiveSync_Folder_Imap::HIGHESTMODSEQ => 200);
130        $fixture = array(46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653);
131        $folder->setChanges($fixture);
132        $folder->setStatus($status);
133        $folder->updateState();
134        $serialized = serialize($folder);
135        // General test that the imap uid compression worked.
136        $this->assertTrue(strlen($serialized) < 300);
137        $folder = unserialize($serialized);
138        // Ensure the values were preserved.
139        $this->assertEquals($fixture, $folder->messages());
140    }
141
142    public function testSerializationWithoutImapCompression()
143    {
144        $folder = new Horde_ActiveSync_Folder_Imap('Trash', Horde_ActiveSync::CLASS_EMAIL);
145        $status = array(Horde_ActiveSync_Folder_Imap::UIDVALIDITY => 100, Horde_ActiveSync_Folder_Imap::UIDNEXT => 47654, Horde_ActiveSync_Folder_Imap::HIGHESTMODSEQ => 200);
146        $fixture = array(46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786);
147        $folder->setChanges($fixture);
148        $folder->setStatus($status);
149        $folder->updateState();
150        $serialized = serialize($folder);
151        $folder = unserialize($serialized);
152        $this->assertEquals($fixture, $folder->messages());
153
154    }
155
156
157}