15
15
import pytest
16
16
import tempfile
17
17
import shutil
18
+ import unittest
18
19
19
20
from c2pa import Builder , Error , Reader , SigningAlg , create_signer , sdk_version , sign_ps256 , version
20
21
@@ -59,126 +60,132 @@ def getitem(d, key):
59
60
}
60
61
}
61
62
62
- def test_v2_read_cloud_manifest ():
63
- reader = Reader .from_file ("tests/fixtures/cloud.jpg" )
64
- manifest = reader .get_active_manifest ()
65
- assert manifest is not None
63
+ class TestC2paSdk (unittest .TestCase ):
64
+ def test_version (self ):
65
+ assert version () == "0.6.2"
66
66
67
- def test_version ( ):
68
- assert version () == "0.6.1"
67
+ def test_sdk_version ( self ):
68
+ assert "c2pa-rs/" in sdk_version ()
69
69
70
- def test_sdk_version ():
71
- assert "c2pa-rs/" in sdk_version ()
72
-
73
- def test_v2_read ():
74
- #example of reading a manifest store from a file
75
- try :
76
- reader = Reader .from_file ("tests/fixtures/C.jpg" )
70
+ class TestReader (unittest .TestCase ):
71
+ def test_v2_read_cloud_manifest (self ):
72
+ reader = Reader .from_file ("tests/fixtures/cloud.jpg" )
77
73
manifest = reader .get_active_manifest ()
78
74
assert manifest is not None
79
- assert "make_test_images" in manifest ["claim_generator" ]
80
- assert manifest ["title" ]== "C.jpg"
81
- assert manifest ["format" ] == "image/jpeg"
82
- # There should be no validation status errors
83
- assert manifest .get ("validation_status" ) == None
84
- # read creative work assertion (author name)
85
- assert getitem (manifest ,("assertions" ,0 ,"label" )) == "stds.schema-org.CreativeWork"
86
- assert getitem (manifest ,("assertions" ,0 ,"data" ,"author" ,0 ,"name" )) == "Adobe make_test"
87
- # read Actions assertion
88
- assert getitem (manifest ,("assertions" ,1 ,"label" )) == "c2pa.actions"
89
- assert getitem (manifest ,("assertions" ,1 ,"data" ,"actions" ,0 ,"action" )) == "c2pa.created"
90
- # read signature info
91
- assert getitem (manifest ,("signature_info" ,"issuer" )) == "C2PA Test Signing Cert"
92
- # read thumbnail data from file
93
- assert getitem (manifest ,("thumbnail" ,"format" )) == "image/jpeg"
94
- # check the thumbnail data
95
- uri = getitem (manifest ,("thumbnail" ,"identifier" ))
96
- reader .resource_to_file (uri , "target/thumbnail_read_v2.jpg" )
97
-
98
- except Exception as e :
99
- print ("Failed to read manifest store: " + str (e ))
100
- exit (1 )
101
-
102
- def test_reader_from_file_no_store ():
103
- with pytest .raises (Error .ManifestNotFound ) as err :
104
- reader = Reader .from_file ("tests/fixtures/A.jpg" )
105
-
106
- def test_v2_sign ():
107
- # define a source folder for any assets we need to read
108
- data_dir = "tests/fixtures/"
109
- try :
110
- key = open (data_dir + "ps256.pem" , "rb" ).read ()
111
- def sign (data : bytes ) -> bytes :
112
- return sign_ps256 (data , key )
113
-
114
- certs = open (data_dir + "ps256.pub" , "rb" ).read ()
115
- # Create a local signer from a certificate pem file
116
- signer = create_signer (sign , SigningAlg .PS256 , certs , "http://timestamp.digicert.com" )
117
-
118
- builder = Builder (manifest_def )
119
-
120
- builder .add_ingredient_file (ingredient_def , data_dir + "A.jpg" )
121
-
122
- builder .add_resource_file ("A.jpg" , data_dir + "A.jpg" )
123
-
124
- builder .to_archive (open ("target/archive.zip" , "wb" ))
125
-
126
- builder = Builder .from_archive (open ("target/archive.zip" , "rb" ))
127
-
128
- with tempfile .TemporaryDirectory () as output_dir :
129
- output_path = output_dir + "out.jpg"
130
- if os .path .exists (output_path ):
131
- os .remove (output_path )
132
- c2pa_data = builder .sign_file (signer , data_dir + "A.jpg" , output_dir + "out.jpg" )
133
- assert len (c2pa_data ) > 0
134
-
135
- reader = Reader .from_file (output_dir + "out.jpg" )
136
- print (reader .json ())
137
- manifest_store = json .loads (reader .json ())
138
- manifest = manifest_store ["manifests" ][manifest_store ["active_manifest" ]]
139
- assert "python_test" in manifest ["claim_generator" ]
140
- # check custom title and format
141
- assert manifest ["title" ]== "My Title"
142
- assert manifest ,["format" ] == "image/jpeg"
143
- # There should be no validation status errors
144
- assert manifest .get ("validation_status" ) == None
145
- assert manifest ["ingredients" ][0 ]["relationship" ] == "parentOf"
146
- assert manifest ["ingredients" ][0 ]["title" ] == "A.jpg"
147
- except Exception as e :
148
- print ("Failed to sign manifest store: " + str (e ))
149
- exit (1 )
150
-
151
- # Test signing the same source and destination file
152
- def test_v2_sign_file_same ():
153
- data_dir = "tests/fixtures/"
154
- try :
155
- key = open (data_dir + "ps256.pem" , "rb" ).read ()
156
- def sign (data : bytes ) -> bytes :
157
- return sign_ps256 (data , key )
158
-
159
- certs = open (data_dir + "ps256.pub" , "rb" ).read ()
160
- # Create a local signer from a certificate pem file
161
- signer = create_signer (sign , SigningAlg .PS256 , certs , "http://timestamp.digicert.com" )
162
-
163
- builder = Builder (manifest_def )
164
-
165
- builder .add_resource_file ("A.jpg" , data_dir + "A.jpg" )
166
-
167
- with tempfile .TemporaryDirectory () as output_dir :
168
- path = output_dir + "/A.jpg"
169
- # Copy the file from data_dir to output_dir
170
- shutil .copy (data_dir + "A.jpg" , path )
171
- c2pa_data = builder .sign_file (signer , path , path )
172
- assert len (c2pa_data ) > 0
173
-
174
- reader = Reader .from_file (path )
175
- manifest = reader .get_active_manifest ()
176
75
76
+ def test_v2_read (self ):
77
+ #example of reading a manifest store from a file
78
+ try :
79
+ reader = Reader .from_file ("tests/fixtures/C.jpg" )
80
+ manifest = reader .get_active_manifest ()
81
+ assert manifest is not None
82
+ assert "make_test_images" in manifest ["claim_generator" ]
83
+ assert manifest ["title" ]== "C.jpg"
84
+ assert manifest ["format" ] == "image/jpeg"
85
+ # There should be no validation status errors
86
+ assert manifest .get ("validation_status" ) == None
87
+ # read creative work assertion (author name)
88
+ assert getitem (manifest ,("assertions" ,0 ,"label" )) == "stds.schema-org.CreativeWork"
89
+ assert getitem (manifest ,("assertions" ,0 ,"data" ,"author" ,0 ,"name" )) == "Adobe make_test"
90
+ # read Actions assertion
91
+ assert getitem (manifest ,("assertions" ,1 ,"label" )) == "c2pa.actions"
92
+ assert getitem (manifest ,("assertions" ,1 ,"data" ,"actions" ,0 ,"action" )) == "c2pa.created"
93
+ # read signature info
94
+ assert getitem (manifest ,("signature_info" ,"issuer" )) == "C2PA Test Signing Cert"
95
+ # read thumbnail data from file
96
+ assert getitem (manifest ,("thumbnail" ,"format" )) == "image/jpeg"
97
+ # check the thumbnail data
98
+ uri = getitem (manifest ,("thumbnail" ,"identifier" ))
99
+ reader .resource_to_file (uri , "target/thumbnail_read_v2.jpg" )
100
+
101
+ except Exception as e :
102
+ print ("Failed to read manifest store: " + str (e ))
103
+ exit (1 )
104
+
105
+ def test_reader_from_file_no_store (self ):
106
+ with pytest .raises (Error .ManifestNotFound ) as err :
107
+ reader = Reader .from_file ("tests/fixtures/A.jpg" )
108
+
109
+ class TestSignerr (unittest .TestCase ):
110
+ def test_v2_sign (self ):
111
+ # define a source folder for any assets we need to read
112
+ data_dir = "tests/fixtures/"
113
+ try :
114
+ key = open (data_dir + "ps256.pem" , "rb" ).read ()
115
+ def sign (data : bytes ) -> bytes :
116
+ return sign_ps256 (data , key )
117
+
118
+ certs = open (data_dir + "ps256.pub" , "rb" ).read ()
119
+ # Create a local signer from a certificate pem file
120
+ signer = create_signer (sign , SigningAlg .PS256 , certs , "http://timestamp.digicert.com" )
121
+
122
+ builder = Builder (manifest_def )
123
+
124
+ builder .add_ingredient_file (ingredient_def , data_dir + "A.jpg" )
125
+
126
+ builder .add_resource_file ("A.jpg" , data_dir + "A.jpg" )
127
+
128
+ builder .to_archive (open ("target/archive.zip" , "wb" ))
129
+
130
+ builder = Builder .from_archive (open ("target/archive.zip" , "rb" ))
131
+
132
+ with tempfile .TemporaryDirectory () as output_dir :
133
+ output_path = output_dir + "out.jpg"
134
+ if os .path .exists (output_path ):
135
+ os .remove (output_path )
136
+ c2pa_data = builder .sign_file (signer , data_dir + "A.jpg" , output_dir + "out.jpg" )
137
+ assert len (c2pa_data ) > 0
138
+
139
+ reader = Reader .from_file (output_dir + "out.jpg" )
140
+ print (reader .json ())
141
+ manifest_store = json .loads (reader .json ())
142
+ manifest = manifest_store ["manifests" ][manifest_store ["active_manifest" ]]
143
+ assert "python_test" in manifest ["claim_generator" ]
177
144
# check custom title and format
178
145
assert manifest ["title" ]== "My Title"
179
- assert manifest ["format" ] == "image/jpeg"
146
+ assert manifest , ["format" ] == "image/jpeg"
180
147
# There should be no validation status errors
181
148
assert manifest .get ("validation_status" ) == None
182
- except Exception as e :
183
- print ("Failed to sign manifest store: " + str (e ))
184
- #exit(1)
149
+ assert manifest ["ingredients" ][0 ]["relationship" ] == "parentOf"
150
+ assert manifest ["ingredients" ][0 ]["title" ] == "A.jpg"
151
+ except Exception as e :
152
+ print ("Failed to sign manifest store: " + str (e ))
153
+ exit (1 )
154
+
155
+ # Test signing the same source and destination file
156
+ def test_v2_sign_file_same (self ):
157
+ data_dir = "tests/fixtures/"
158
+ try :
159
+ key = open (data_dir + "ps256.pem" , "rb" ).read ()
160
+ def sign (data : bytes ) -> bytes :
161
+ return sign_ps256 (data , key )
162
+
163
+ certs = open (data_dir + "ps256.pub" , "rb" ).read ()
164
+ # Create a local signer from a certificate pem file
165
+ signer = create_signer (sign , SigningAlg .PS256 , certs , "http://timestamp.digicert.com" )
166
+
167
+ builder = Builder (manifest_def )
168
+
169
+ builder .add_resource_file ("A.jpg" , data_dir + "A.jpg" )
170
+
171
+ with tempfile .TemporaryDirectory () as output_dir :
172
+ path = output_dir + "/A.jpg"
173
+ # Copy the file from data_dir to output_dir
174
+ shutil .copy (data_dir + "A.jpg" , path )
175
+ c2pa_data = builder .sign_file (signer , path , path )
176
+ assert len (c2pa_data ) > 0
177
+
178
+ reader = Reader .from_file (path )
179
+ manifest = reader .get_active_manifest ()
180
+
181
+ # check custom title and format
182
+ assert manifest ["title" ]== "My Title"
183
+ assert manifest ["format" ] == "image/jpeg"
184
+ # There should be no validation status errors
185
+ assert manifest .get ("validation_status" ) == None
186
+ except Exception as e :
187
+ print ("Failed to sign manifest store: " + str (e ))
188
+ #exit(1)
189
+
190
+ if __name__ == '__main__' :
191
+ unittest .main ()
0 commit comments